সি কোডে টাইমস্পেক_জেটের () সেকেন্ডের উপাদানগুলির পিছনে সময় দ্বারা () কখনও কখনও 1 সেকেন্ড কেন রিপোর্ট করা হয়?


12

নিম্নলিখিত কোড স্নিপেট:

struct timespec ts;
for (int x = 0; x < 100000000; x++) {
    timespec_get(&ts, TIME_UTC);
    long cTime = (long) time(NULL);
    if (cTime != ts.tv_sec && ts.tv_nsec < 3000000) {
        printf("cTime: %ld\n", cTime);
        printf("ts.tv_sec: %ld\n", ts.tv_sec);
        printf("ts.tv_nsec: %ld\n", ts.tv_nsec);
    }
}

এই আউটপুট উত্পাদন করে:

...
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2527419
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2534036
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2540359
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2547039
...

কেন মধ্যে অমিল cTimeএবং ts.tv_sec? নোট করুন যে শর্তসাপেক্ষে পরিবর্তন করা থাকলে সমস্যা দেখা দেয় না ts.tv_nsec >= 3000000। সমস্যা ন্যানোসেকেন্ডগুলি 3000000 এর চেয়ে ছোট হওয়ার উপর নির্ভর করে।


ব্যবহৃত অপারেটিং সিস্টেম, এর সংস্করণ, ব্যবহৃত সি লাইব্রেরির সংস্করণ সম্পর্কে আপনার আরও সুনির্দিষ্ট হওয়া দরকার।
কিছু প্রোগ্রামার

2
@ সোমাগ্রোগ্রামারডুড লিনাক্স ডেবিয়ান 8, জিসিসি 6.3.0।
থিও ডি'অর

কি timespec_get()? এটি কি সি বা সি ++? দেখে মনে হচ্ছে std::timespec_get। উপযুক্ত ট্যাগ ব্যবহার করুন।
মার্কো বোনেলি

@ মার্কোবোনেলি: এটি সি 11 এ সি যুক্ত করা হয়েছিল। অনলাইনে পুনরুত্পাদন করতে পারে
শ্যাডোর্যাঞ্জার

@ শ্যাডোএ্যাঞ্জার রেফারেন্সের জন্য আপনাকে ধন্যবাদ, আমি আমার সিস্টেমে কোনও manপ্রবেশিকা দেখতে পেলাম না timespec_getতাই আমি সিদ্ধান্তে উপনীত হলাম। বোধ হয়।
মার্কো বোনেলি

উত্তর:


11

কারণটি হ'ল, আপনি (স্পষ্টভাবে) বিভিন্ন সিস্টেমের ঘড়ি ব্যবহার করেন। timespec_get()ব্যবহার হাই রেজোলিউশনের সিস্টেম-ব্যাপী রিয়েলটাইম ঘড়ি, যখন time()ব্যবহারসমূহ মোটা রিয়েলটাইম ঘড়ি।

ব্যবহার করার চেষ্টা করুন

clock_gettime(CLOCK_REALTIME_COARSE, &ts);

আপনার পরিবর্তে timespec_get(), তারপরে পার্থক্যটি লোপ পাবে।

সম্পাদনা:

এটি লিনাক্স কার্নেল উত্স, v Clo_gettime.c এ দেখা যাবে

প্রকৃতপক্ষে বিষয়টি এখানে দেখার জন্য কিছুটা সূক্ষ্ম। কাঠামোর সদস্যদের ব্যবহৃত সেকেন্ডের অংশটি অভিন্ন মানগুলি ব্যবহার করে CLOCK_REALTIME_COARSEএবং CLOCK_REALTIMEএতে থাকে তবে ন্যানোসেকেন্ডস-অংশটি আলাদা; সঙ্গে CLOCK_REALTIMEএটা চেয়ে বড় হতে পারে 1000000000(যা এক সেকেন্ড যায়)। এই ক্ষেত্রে, এটি কলটিতে স্থির করা হয়েছে:

ts->tv_sec += __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
ts->tv_nsec = ns;

এই সংশোধন না হয় CLOCK_REALTIME_COARSEবা সঙ্গে করা হয় time()। এটি CLOCK_REALTIMEএবং এর মধ্যে পার্থক্য ব্যাখ্যা করে time()


এটি কি কোথাও নথিভুক্ত করা হয়েছে, বা time(সম্ভবত) আরও পারফরম্যান্সযুক্ত তবে কম নির্ভুল ঘড়ি (তত্ত্বের ভিত্তিতে যে এটি যেহেতু কেবলমাত্র দ্বিতীয় গ্রানুলারিটি পেয়েছে, তাই যার যথার্থতা প্রয়োজন) এর সাথে বাস্তবায়িত হওয়ার একটি নিদর্শন কী? যখন আপনি কেবল দ্বিতীয় গ্রানুলারিটির জন্য জিজ্ঞাসা করছেন তখন আমার ধারণাটি এতটা গুরুত্বপূর্ণ নয় যখন মিলি সেকেন্ড বা তাই (অনলাইন পরীক্ষাগুলি মাঝে মাঝে এমএসএসের মধ্যে অনেক বেশি পিছিয়ে পড়েছিল তবে খুব বেশি নয়) Lag
শ্যাডোএ্যাঞ্জার

@ShadowRanger আমি আরো কিছু বিবরণ যোগ
CTX

অভিপ্রায়ের সুস্পষ্ট ডকুমেন্টেশন নয়, তবে এটি একটি ভোট গ্রহণের জন্য যথেষ্ট বিশদ। :-) মজার বিষয় যে ঘড়িটি আসলে এক সেকেন্ডের অতিরিক্ত অতিরিক্ত ন্যানোসেকেন্ডের চেয়ে বেশি রিপোর্ট করতে পারে।
শ্যাডোএ্যাঞ্জার

@ শ্যাডোএ্যাঞ্জার আমি এর উত্স ব্যতীত সত্যিকারের কোন দলিল খুঁজে পাইনি, যার অর্থ এটিও হ'ল পূর্বের বিজ্ঞপ্তি ছাড়াই আচরণটি বিশদভাবে পরিবর্তিত হতে পারে
Ctx

@ সিটিএক্স বিস্তারিত উত্তরের জন্য আপনাকে ধন্যবাদ! আপনি যে পরামর্শ দিচ্ছেন টাইমস্পেক_জেটের পরিবর্তে টাইমস্পেক_জেট () ব্যবহার করব, যেমন টাইমস্পেক_জেট () পোসিক্সের পরিবর্তে সি 11 হয় এবং কোন ঘড়িটি ব্যবহার করতে হবে তার সেটিংসের প্রয়োজন হয় না। আমার ধারণা ছিল না যে বিভিন্ন ঘড়ি ব্যবহার করা হয়েছে, তবে পছন্দটি দেওয়া হয়েছে, মোটা ঘড়িটি ব্যবহার করার ক্ষেত্রে আমি খুব একটা পয়েন্ট দেখতে পাচ্ছি না।
থিও ডি'অর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.