লিনাক্সে সময় পরিমাপ করুন - সময় বনাম ঘড়ি বনাম গেট্রাসেজ বনাম ঘড়ি_সেটটাইম বনাম গেটটাইম ডে বনাম টাইমস্পেক_জেট?


148

সময়জ্ঞান ফাংশন মধ্যে time, clock getrusage, clock_gettime, gettimeofdayএবং timespec_get, আমি পরিষ্কারভাবে বুঝতে কিভাবে তারা প্রয়োগ করা হয় চান এবং অর্ডার জানেন যে যা পরিস্থিতি আমি তাদের ব্যবহার করতে হবে তাদের প্রত্যাবর্তন মান কি আছে।

প্রথমে আমাদের ফাংশনগুলি ফিরিয়ে আনার প্রক্রিয়া বা থ্রেডের মানগুলির সাথে তুলনা করে প্রাচীর-ঘড়ির মানগুলি ফাংশন শ্রেণীবদ্ধ করতে হবে । প্রাচীর-ঘড়ির মান প্রদান করে, দেয়াল-ঘড়ির মান বা প্রক্রিয়া বা থ্রেডের মানকে দেওয়া প্যারামিটারের উপর নির্ভর করে দেয় । এবং প্রক্রিয়া মান ফেরত।gettimeofdayclock_gettimeClockgetrusageclock

তারপরে দ্বিতীয় প্রশ্নটি এই ফাংশনগুলির বাস্তবায়ন সম্পর্কিত এবং ফলস্বরূপ, তাদের যথার্থতা সম্পর্কিত। কোন হার্ডওয়্যার বা সফ্টওয়্যার প্রক্রিয়া এই ফাংশনগুলি ব্যবহার করে।

দেখে মনে হচ্ছে যে getrusageকেবল কার্নেল টিক ব্যবহার করেন (সাধারণত 1 মিমি দীর্ঘ) এবং ফলস্বরূপ এমএস থেকে আরও নির্ভুল হতে পারে না। এটা কি ঠিক? তারপরে getimeofdayফাংশনটি উপলব্ধ সবচেয়ে সঠিক অন্তর্নিহিত হার্ডওয়্যার ব্যবহার করে বলে মনে হচ্ছে। ফলস্বরূপ এর যথার্থতাটি সাম্প্রতিক হার্ডওয়্যারে সাধারণত মাইক্রোসেকেন্ড হয় (এপিআই-র কারণে বেশি হতে পারে না)। কী clock, ম্যান পেজটি "আনুমানিকতা" সম্পর্কে কথা বলে, এর অর্থ কী? কী clock_gettime, এপিআই ন্যানোসেকেন্ডে রয়েছে, এর অর্থ কি এটি অন্তর্নিহিত হার্ডওয়্যার অনুমতি দিলে এটি এত নির্ভুল হতে সক্ষম? একঘেয়েমি কি?

অন্য কোন কাজ আছে?

উত্তর:


198

সমস্যাটি হ'ল সি এবং সি ++ তে বেশ কয়েকটি পৃথক সময় ফাংশন পাওয়া যায় এবং এর মধ্যে কিছু বাস্তবায়নের মধ্যে আচরণের ক্ষেত্রে পৃথক হয়। চারদিকে প্রচুর ভাসমান অর্ধ-উত্তরও রয়েছে। তাদের বৈশিষ্ট্যগুলির সাথে ক্লক ফাংশনের একটি তালিকা সংকলন করা ঠিকমতো প্রশ্নের উত্তর দেয়। শুরু করার জন্য আসুন আমরা কী প্রাসঙ্গিক বৈশিষ্ট্যগুলি খুঁজছি তা জিজ্ঞাসা করি। আপনার পোস্টের দিকে তাকিয়ে, আমি পরামর্শ দিচ্ছি:

  • ঘড়ির সাহায্যে কত সময় পরিমাপ করা হয়? (বাস্তব, ব্যবহারকারী, সিস্টেম, বা আশা, প্রাচীর-ঘড়ি নেই?)
  • ঘড়ির যথার্থতা কী? (গুলি, এমএস, এস, বা দ্রুত?)
  • কতক্ষণ পরে ঘড়ির কাঁটা ঘুরে বেড়ায়? নাকি এড়িয়ে যাওয়ার কোনও ব্যবস্থা আছে?
  • ঘড়িটি কি একঘেয়ে, নাকি এটি সিস্টেমের সময় পরিবর্তনের সাথে পরিবর্তিত হবে (এনটিপি, সময় অঞ্চল, দিবালোক সঞ্চয় সময়, ব্যবহারকারীর মাধ্যমে ইত্যাদি)?
  • উপরোক্ত বাস্তবায়নের মধ্যে কীভাবে আলাদা হয়?
  • নির্দিষ্ট ফাংশনটি কি অচল, মানহীন ইত্যাদি?

তালিকাটি শুরুর আগে আমি উল্লেখ করতে চাই যে ওয়াল-ক্লক সময়টি ব্যবহারের জন্য খুব কমই সঠিক সময় পাওয়া যায়, যেখানে সময় অঞ্চল পরিবর্তন, দিবালোকের সঞ্চয় সময় পরিবর্তনের সাথে বা দেয়াল ঘড়িটি এনটিপি দ্বারা সিঙ্ক্রোনাইজ করা থাকলে changes আপনি সময়সূচি সময়সূচী তৈরি করতে বা মানদণ্ডের পারফরম্যান্স ব্যবহার করতে পারলে এই জিনিসগুলির কোনওটিই ভাল নয়। নামটি যা বলে, কেবল প্রাচীরের একটি ঘড়ি (বা ডেস্কটপ) তার পক্ষে এটি কেবল সত্যই।

লিনাক্স এবং ওএস এক্সের ঘড়ির জন্য আমি এখন পর্যন্ত যা পেয়েছি তা এখানে:

  • time() ওএস থেকে প্রাচীর-ঘড়ির সময়টি সেকেন্ডে নির্ভুলতার সাথে ফেরত দেয়।
  • clock()ব্যবহারকারীর এবং সিস্টেমের সময়ের যোগফল ফেরত বলে মনে হচ্ছে। এটি সি 98 এবং এর পরে উপস্থিত রয়েছে। এক সময় এটি চক্রগুলিতে সিপিইউ সময় হওয়ার কথা ছিল তবে পসিক্সের মতো আধুনিক মানের জন্য CLOCKS_PER_SEC প্রয়োজন 1000000, সর্বাধিক 1 1s যথাযথ নির্ভুলতা প্রদান করে। আমার সিস্টেমে যথার্থতা 1 µ এই ঘড়িটি একবারে শীর্ষে উঠলে প্রায় aroundেকে ফেলা হয় (এটি সাধারণত M 2 ^ 32 টিকের পরে ঘটে যা 1 মেগাহার্জ ঘড়ির জন্য খুব বেশি দীর্ঘ নয়)। man clockবলেছেন যে গ্লিবসি ২.১18 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...)এ লিনাক্সে প্রয়োগ করা হয়েছে।
  • clock_gettime(CLOCK_MONOTONIC, ...)ন্যানোসেকেন্ড রেজোলিউশন সরবরাহ করে, এটি মনোোটোনিক। আমি বিশ্বাস করি যে 'সেকেন্ড' এবং 'ন্যানোসেকেন্ডস' আলাদাভাবে সংরক্ষণ করা হয়েছে, প্রতিটি 32-বিট কাউন্টারে। সুতরাং, যে কোনও মোড়কের চারপাশে অনেক ডজন বছর আপটাইম পরে ঘটতে পারে। এটি দেখতে খুব ভাল একটি ঘড়ির মতো দেখাচ্ছে, তবে দুর্ভাগ্যক্রমে এটি এখনও ওএস এক্সে উপলভ্য নয় P পসিক্স 7 চ্ছিক এক্সটেনশন হিসাবে বর্ণনা করেCLOCK_MONOTONIC
  • getrusage()আমার পরিস্থিতির জন্য সেরা পছন্দ হিসাবে দেখা গেছে। এটি ব্যবহারকারী এবং সিস্টেমের সময়গুলি পৃথকভাবে প্রতিবেদন করে এবং চারপাশে মোড়ানো হয় না। আমার সিস্টেমে যথার্থতা 1 is গুলি, তবে আমি এটি একটি লিনাক্স সিস্টেমেও পরীক্ষা করেছি (জিডিসি 4.1.2 সহ রেড হ্যাট 4.1.2-48) এবং সেখানে নির্ভুলতা ছিল মাত্র 1 এমএস।
  • gettimeofday()প্রাচীর-ঘড়ির সময়টি (নামমাত্র) এর যথার্থতার সাথে ফিরিয়ে দেয়। আমার সিস্টেমে এই ঘড়িটির যথাযথতা আছে বলে মনে হয় তবে এটি গ্যারান্টিযুক্ত নয় কারণ "সিস্টেম ঘড়ির রেজোলিউশন হার্ডওয়্যার নির্ভর" । POSIX.1-2-2008 এটি বলে । "অ্যাপ্লিকেশনগুলিকে clock_gettime()অপ্রচলিত ফাংশনের পরিবর্তে ফাংশনটি ব্যবহার করা উচিত gettimeofday()", সুতরাং আপনার এটি থেকে দূরে থাকা উচিত। লিনাক্স x86 এবং এটি সিস্টেম কল হিসাবে প্রয়োগ করে ।
  • mach_absolute_time()ওএস এক্স-তে খুব উচ্চ রেজোলিউশনের (এনএস) সময় দেওয়ার জন্য একটি বিকল্প option আমার সিস্টেমে এটি এনএস রেজোলিউশন দেয় resolution নীতিগতভাবে এই ঘড়ির চারপাশে মোড়ানো, তবে এটি একটি 64-বিট স্বাক্ষরবিহীন পূর্ণসংখ্যার ব্যবহার করে এনএস সংরক্ষণ করছে, সুতরাং চারপাশে মোড়ানোটি বাস্তবে কোনও সমস্যা হওয়া উচিত নয়। বহনযোগ্যতা প্রশ্নবিদ্ধ।
  • আমি এই স্নিপেটের উপর ভিত্তি করে একটি হাইব্রিড ফাংশন লিখেছি যা লিনাক্স এবং ওএস এক্স উভয়ের জন্য এনএস যথাযথতা পেতে লিনাক্সে সংকলিত হওয়ার সময় ক্লক_জেটটাইম বা ওএস এক্স-এ সংকলিত হওয়ার সময় ম্যাক টাইমার ব্যবহার করে wrote

উপরে বর্ণিত সমস্তগুলি লিনাক্স এবং ওএস এক্স উভয় ক্ষেত্রেই রয়েছে যেখানে অন্যথায় নির্দিষ্ট করা আছে। উপরের "আমার সিস্টেম" হ'ল ম্যাপপোর্টগুলি থেকে জিসিসি 4.7.2 সহ একটি অ্যাপল চলমান ওএস এক্স 10.8.3।

অবশেষে, এখানে নীচের লিঙ্কগুলি ছাড়াও সহায়ক বলে মনে হয়েছে এমন একটি সূত্রের তালিকা:


আপডেট : ওএস এক্সের জন্য, clock_gettime10.12 (সিয়েরা) হিসাবে কার্যকর করা হয়েছে। এছাড়াও, POSIX এবং BSD ভিত্তিক প্ল্যাটফর্মগুলি (ওএস এক্সের মতো) rusage.ru_utimeস্ট্রাক্ট ক্ষেত্রটি ভাগ করে share


ম্যাক ওএস এক্স এর নেই clock_gettime, অতএব এর gettimeofday()চেয়ে কিছুটা বহুমুখী হওয়ার ব্যবহারclock_gettime()
bobobobo

1
আপনি উল্লেখ করেন নি times()(একটি গুলি সহ), যা ইস্যু 1 এর পর থেকে পসিক্সে বিদ্যমান রয়েছে: জিএনইউ / লিনাক্স সম্পর্কিত: ঘড়ির (3) ম্যান পৃষ্ঠা অনুসারে, clock()গ্লিবসি ২.১17 থেকে এর আগে এটি প্রয়োগ করা হয়েছিল, তবে উন্নতির জন্য নির্ভুলতা, এটি এখন শীর্ষে প্রয়োগ করা হয়েছে clock_gettime(CLOCK_PROCESS_CPUTIME_ID,...), যা পসিক্সেও নির্দিষ্ট রয়েছে তবে এটি alচ্ছিক।
ভিঙ্ক 17

2
@ স্টারফ্লায়ার ঘড়ির নির্ভুলতা ঘড়িটি পোল করতে যে পরিমাণ সময় লাগে তার দ্বারা আংশিকভাবে সীমাবদ্ধ। এটি কারণ, যদি আমি ঘড়িটি কল করি এবং এটি ফিরে আসতে 1 µ সেকেন্ড সময় নেয়, তবে ঘড়ির প্রতিবেদনের সময়টির কলকের দৃষ্টিকোণ থেকে 1 µ গুলি "অফ" হয়ে যাবে। এর অর্থ হ'ল একটি অত্যন্ত নির্ভুল ঘড়িটি অবশ্যই কম-বিলম্বিত হতে হবে। তাই সাধারণত যেগুলির সম্পর্কে আপনি কথা বলছেন তার মধ্যে কোনওটিই বন্ধ রাখবে না: সস্তার ঘড়িগুলিও সবচেয়ে নির্ভুল হবে।
ডগলাস বি স্ট্যাপল

3
এছাড়াও বেশিরভাগ ঘড়িগুলি দিবালোক সংরক্ষণের সময় / সময় অঞ্চলগুলি বিবেচনা করে না, এমনকি যদি সেগুলি ওয়াল ঘড়ি হিসাবে বিবেচিত হয় । উভয়ই timeএবং gettimeofdayফিরে আসুন, কমপক্ষে আজকাল, যুগের কয়েক সেকেন্ড পরে (ওরফে ইউনিক্স-টাইমস্ট্যাম্পস)। এটি সময় অঞ্চল / ডিএসটি-র থেকে পৃথক। লিপ সেকেন্ড অন্য গল্প ...
জুলান

2
অ্যান্ড্রয়েড ব্যবহারকারীদের জন্য, ক্লক_মোনটোনিক ব্যবহার করা সমস্যাযুক্ত হতে পারে যেহেতু ঘড়ির সাথে সাথে অ্যাপটি স্থগিত হয়ে যেতে পারে। তার জন্য, অ্যান্ড্রয়েডে ANDROID_ALARM_ELAPSED_REALTIME টাইমার যুক্ত করেছে যা ioctl এর মাধ্যমে অ্যাক্সেসযোগ্য। এগুলি এবং অন্যান্য স্থগিত সম্পর্কিত কিছু তথ্য এখানে
Itay Bianco

17

C11 timespec_get

ব্যবহারের উদাহরণ এখানে: https://stackoverflow.com/a/36095407/895245

প্রত্যাশিত সর্বাধিক যথাযথ নির্ভুলতা হ'ল ন্যানোসেকেন্ডস, তবে আসল যথার্থতা বাস্তবায়ন সংজ্ঞায়িত এবং এটি আরও ছোট হতে পারে।

এটি দেয়ালের সময় দেয়, সিপিইউ ব্যবহার না করে।

glibc 2.21 এটি এর অধীনে প্রয়োগ করে sysdeps/posix/timespec_get.cএবং এটি সরাসরি এখানে এগিয়ে যায়:

clock_gettime (CLOCK_REALTIME, ts) < 0)

clock_gettimeএবং CLOCK_REALTIMEহ'ল পসিএক্স http://pubs.opengroup.org/onlinepubs/9699919799/function/ ॉक_ getres.html , এবং man clock_gettimeবলেছে যে আপনার প্রোগ্রামটি চলাকালীন আপনি যদি কিছু সিস্টেমের সময় সেটিংস পরিবর্তন করেন তবে এই পদক্ষেপটি বিরতি পেতে পারে।

সি ++ 11 ক্রোনো

যেহেতু আমরা এটিতে এসেছি, আসুন তাদের পাশাপাশি কভার করুন: http://en.cppreferences.com/w/cpp/chrono

জিসিসি 5.3.0 (সি ++ স্ট্ডলিব জিসিসির উত্সের অভ্যন্তরে রয়েছে):

  • high_resolution_clock জন্য একটি উপনাম system_clock
  • system_clock নিম্নলিখিত যে প্রথম উপলব্ধ তা এগিয়ে:
    • clock_gettime(CLOCK_REALTIME, ...)
    • gettimeofday
    • time
  • steady_clock নিম্নলিখিত যে প্রথম উপলব্ধ তা এগিয়ে:
    • clock_gettime(CLOCK_MONOTONIC, ...)
    • system_clock

জিজ্ঞাসা করা হয়েছে: স্ট্যান্ড :: সিস্টেম_ক্লাব এবং স্টাড :: স্টেডি_ ক্লক এর মধ্যে পার্থক্য?

CLOCK_REALTIMEবনাম CLOCK_MONOTONIC: CLOCK_REALTIME এবং CLOCK_MONOTONIC এর মধ্যে পার্থক্য?


1
দুর্দান্ত উত্তর যা টিপিকাল বাস্তবায়নকে অপমানিত করে। মানুষের সত্যই এটি জানা উচিত।
Celess
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.