التابع 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.