التابع Process.clock_gettime في روبي

من موسوعة حسوب

يعيد التابع clock_gettime الوقت المعادة عبر الدالة clock_gettime()‎ التي تخص POSIX.

البنية العامة

clock_gettime(clock_id [, unit])  number

تعيد الدالة الضمنية، التي هي clock_gettime()‎، عدد النانو ثواني. الكائن Float (العدد العشري المضاعف وفق المعيار IEEE 754) ليس كافيًا لتمثيل القيمة المعادة من أجل CLOCK_REALTIME. إن كان عدد النانو ثواني الدقيق نفسه مطلوب، فاستعمل القيمة ‎:nanoseconds مع المعامل unit.

يختلف أصل (نقطة الصفر) القيمة المعادة. على سبيل المثال، يمكن أن يكون نقطة بدء تشغيل النظام، أو بدء تشغيل العملية، أو وقت بدء توقيت يونكس ...إلخ.

يُعرَّف الأصل في CLOCK_REALTIME على أنَّه بدء توقيت يونكس (1970-01-01 00:00:00 UTC). مع ذلك، تجد أنَّ بعض الأنظمة تُدخِل الثواني الكبيسة في الحسبان والآخر لا يفعل ذلك. لذلك، يمكن أن تُفسَّر النتيجة بشكل مختلف عبر الأنظمة. يُنصح باستعمال Time.now عبر CLOCK_REALTIME.

المعاملات

clock_id

يحدِّد نوع النبضات. يُحدَّد هذا المعامل كثابت يبدأ بالسابقة Process::CLOCK_‎ مثل Process::CLOCK_REALTIME و Process::CLOCK_MONOTONIC.

تعتمد الثوابت المدعومة على نظام التشغيل المستعمل وإصداره. توفر روبي الأنواع التالية للمعامل clock_id (إن كانت متاحة بحسب نظام التشغيل):

النوع المعامل clock_id نوع وإصدار نظام التشغيل
CLOCK_REALTIME SUSv2-4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 2.1, macOS 10.12
CLOCK_MONOTONIC SUSv3-4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 3.4, macOS 10.12
CLOCK_PROCESS_CPUTIME_ID SUSv3-4, Linux 2.5.63, OpenBSD 5.4, macOS 10.12
CLOCK_THREAD_CPUTIME_ID SUSv3-4, Linux 2.5.63, FreeBSD 7.1, OpenBSD 5.4, macOS 10.12
CLOCK_VIRTUAL FreeBSD 3.0, OpenBSD 2.1
CLOCK_PROF FreeBSD 3.0, OpenBSD 2.1
CLOCK_REALTIME_FAST FreeBSD 8.1
CLOCK_REALTIME_PRECISE FreeBSD 8.1
CLOCK_REALTIME_COARSE Linux 2.6.32
CLOCK_REALTIME_ALARM Linux 3.0
CLOCK_MONOTONIC_FAST FreeBSD 8.1
CLOCK_MONOTONIC_PRECISE Linux 2.6.32
CLOCK_MONOTONIC_RAW Linux 2.6.28, macOS 10.12
CLOCK_MONOTONIC_RAW_APPROX macOS 10.12
CLOCK_BOOTTIME Linux 2.6.39
CLOCK_BOOTTIME_ALARM Linux 3.0
CLOCK_UPTIME FreeBSD 7.0, OpenBSD 5.5
CLOCK_UPTIME_FAST FreeBSD 8.1
CLOCK_UPTIME_RAW macOS 10.12
CLOCK_UPTIME_RAW_APPROX macOS 10.12
CLOCK_UPTIME_PRECISE FreeBSD 8.1
CLOCK_SECOND FreeBSD 8.1

انتبه إلى أنَّ SUS تعني مواصفات يونكس المنفردة (Single Unix Specification). تحتوي SUS على معايير POSIX و clock_gettime مُعرَّفٌ في أحد أجزاء POSIX. تُعرِّف SUS الثابت CLOCK_REALTIME بشكل اجباري ولكن الثوابت CLOCK_MONOTONIC، و CLOCK_PROCESS_CPUTIME_ID، و CLOCK_THREAD_CPUTIME_ID هي اختيارية.

أضف إلى ذلك أنَّ هنالك العديد من الرموز يمكن استعمالها مع المعامل clock_id، إذ يوجد محاكيات للدالة clock_gettime()‎.

على سبيل المثال، الثابت Process::CLOCK_REALTIME مُعرَّف بالشكل ‎:GETTIMEOFDAY_BASED_CLOCK_REALTIME عندما لا يكون clock_gettime()‎ متاحًا.

محاكيات من أجل CLOCK_REALTIME هي:

المحاكي الوصف
‎:GETTIMEOFDAY_BASED_CLOCK_REALTIME استعمل gettimeofday()‎ المُعرَّف من طرف SUS. (ألغى SUSv4 هذا المحاكي.) الدقة هي 1 ميكروثانية.
‎:TIME_BASED_CLOCK_REALTIME استعمل time()‎ المُعرَّف من طرف ISO C. الدقة هي 1 ثانية.

محاكيات من أجل CLOCK_MONOTONIC هي:

المحاكي الوصف
‎:MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC استعمل mach_absolute_time()‎، وهو متاح على Darwin. تعتمد الدقة على المعالج.
‎:TIMES_BASED_CLOCK_MONOTONIC استعمل القيمة الناتجة من times()‎ المُعرَّف من طرف POSIX. تعرِّفه POSIX بالشكل: "times()‎ يجب أن يعيد الوقت الحقيقي المنقضي في دقات النبضات منذ نقطة اعتباطية في الماضي (وقت بدء تشغيل النظام مثلًا)". على سبيل المثال، يعيد نظام لينكس قيمةً تعمتد على اللحظات (jiffies) وهي رتيبة (monotonic). على أي حال، يستعمل 4.4BSD الدالة gettimeofday()‎ وهي ليست رتيبة. (FreeBSD يستعمل clock_gettime(CLOCK_MONOTONIC)‎ عوضًا عن ذلك.) الدقة هي دقة النبضات. يُظهر الأمر getconf CLK_TCK دقات النبضات بالثانية. (دقات النبضات في الثانية تُعرَّف بواحدة الماكرو هرتز [HZ macro] في الأنظمة القديمة.) إن كانت 100 وكان clock_t هو نوع صحيح بطول 32 بت، فستكون الدقة 10 ميلي ثاينة ولا يمكن أن تصمد أكثر من 497 يوم.

محاكيات من أجل CLOCK_PROCESS_CPUTIME_ID هي:

المحاكي الوصف
‎:GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID استعمل getrusage()‎ المُعرَّف من طرف SUS. تُستعمَل الدالة getrusage()‎ مع RUSAGE_SELF للحصول على الوقت للعملية المستدعية فقط (باستثناء الوقت للعملية الابن). النتيجة هي جمع وقت المستخدم (ru_utime) ووقت النظام (ru_stime). الدقة هي 1 ميكروثاينة.
‎:TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID استعمل times()‎ المُعرَّف من طرف POSIX. النتيجة هي جمع وقت المستخدم (tms_utime) ووقت النظام (tms_stime). يُتجاهَل tms_cutime و tms_cstime لاستثناء الوقت من أجل العمليات الأبناء. الدقة هي دقة النبضة. يُظهِر الأمر getconf CLK_TCK دقات النبضات بالثاينة. (دقات النبضات في الثانية تُعرَّف بواحدة الماكرو هرتز [HZ macro] في الأنظمة القديمة.) إن كانت 100، فستكون الدقة 10 ميلي ثانية.
‎:CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID استعمل clock()‎ المُعرَّفة من طرف ISO C. الدقة هي ‎1/CLOCKS_PER_SEC. إنَّ CLOCKS_PER_SEC هو ماكرو من مستوى C (أي C-level macro) مُعرَّف في الملف time.h. تُعرِّف SUS الثابت CLOCKS_PER_SEC بالقيمة 1000000. قد تُعرِّفه الأنظمة الغير شبيه بيونكس بقيمة مختلفة. إن كانت قيمة CLOCKS_PER_SEC هي 1000000 وكان نوع clock_t عددٌ صحيح بطول 32 بت، فلا يمكن أن تصمد (تمثِّل) أكثر من 72 دقيقة.

إن كانت القيمة المعطاة للمعامل clock_id غير مدعومة، فسيُطلَق الخطأ Errno::EINVAL.

unit

يحدِّد نوع القيمة المعادة. يمكن أن يأخذ إحدى القيم التالية:

قيمة المعامل unit الوصف
‎:float_second عدد عشري يمثِّل عدد الثواني (القيمة الافتراضية).
‎:float_millisecond عدد عشري يمثِّل عدد الميلي ثواني.
‎:float_microsecond عدد عشري يمثِّل عدد الميكرو ثواني.
‎:second عدد صحيح يمثِّل عدد الثواني.
‎:millisecond عدد صحيح يمثِّل عدد الميلي ثواني.
‎:microsecond عدد صحيح يمثِّل عدد الميكرو ثواني.
‎:nanosecond عدد صحيح يمثِّل عدد النانو ثواني.

القيم المعادة

يعاد عدد يمثِّل الوقت المعادة عبر الدالة clock_gettime()‎ التي تخص POSIX.

أمثلة

مثال على استعمال التابع clock_gettime:

p Process.clock_gettime(Process::CLOCK_MONOTONIC)
#=> 896053.968060096

انظر أيضًا

  • التابع abort: ينهي تنفيذ العملية مباشرةً بشكل فعَّال عبر استدعاء Kernel.exit(false)‎.
  • التابع clock_getres: يعيد دقة الوقت المعادة عبر الدالة clock_getres()‎ التي تخص POSIX.

مصادر