Di antara fungsi waktu, time
, clock
getrusage
, clock_gettime
, gettimeofday
dan timespec_get
, saya ingin memahami dengan jelas bagaimana mereka diimplementasikan dan apa nilai-nilai mereka kembali untuk mengetahui di mana situasi saya harus menggunakannya.
Pertama, kita perlu mengklasifikasikan fungsi yang mengembalikan nilai jam dinding dibandingkan dengan fungsi yang mengembalikan nilai proses atau nilai ulir . gettimeofday
mengembalikan nilai jam dinding, clock_gettime
mengembalikan nilai jam dinding atau proses atau nilai untaian tergantung pada Clock
parameter yang diteruskan ke sana. getrusage
dan clock
mengembalikan nilai proses.
Kemudian pertanyaan kedua berkaitan dengan implementasi fungsi-fungsi ini dan sebagai konsekuensinya, keakuratannya. Mekanisme perangkat keras atau perangkat lunak mana yang digunakan fungsi-fungsi ini.
Tampaknya getrusage
hanya menggunakan centang kernel (biasanya 1 ms panjang) dan sebagai akibatnya tidak bisa lebih akurat daripada ms. Apakah tepat? Maka getimeofday
fungsi tersebut tampaknya menggunakan perangkat keras yang paling akurat yang tersedia. Akibatnya akurasinya biasanya mikrodetik (tidak bisa lebih karena API) pada perangkat keras terbaru. Bagaimana dengan clock
, halaman manual berbicara tentang "aproksimasi", apa artinya? Bagaimana dengan clock_gettime
, API dalam nanosecond, apakah ini berarti ia bisa sangat akurat jika perangkat keras yang mendasarinya memungkinkannya? Bagaimana dengan monotonitas?
Apakah ada fungsi lain?
sumber
clock_gettime
, karenanya penggunaangettimeofday()
menjadi sedikit lebih fleksibel daripadaclock_gettime()
times()
(dengan huruf s), yang telah ada di POSIX sejak Edisi 1. Mengenai GNU / Linux: Menurut halaman manual clock (3),clock()
dari glibc 2.17 dan sebelumnya telah diterapkan di atasnya, tetapi untuk peningkatan presisi, sekarang diterapkan di atasclock_gettime(CLOCK_PROCESS_CPUTIME_ID,...)
, yang juga ditentukan dalam POSIX tetapi opsional.time
dangettimeofday
kembali, setidaknya saat ini, detik sejak zaman (alias unix-cap waktu). Ini tidak tergantung pada zona waktu / DST. Detik lompatan adalah cerita lain ...C11
timespec_get
Contoh penggunaan di: https://stackoverflow.com/a/36095407/895245
Presisi maksimum yang mungkin dikembalikan adalah nanodetik, tetapi presisi sebenarnya adalah implementasi yang ditentukan dan bisa lebih kecil.
Ini mengembalikan waktu dinding, bukan penggunaan CPU.
glibc 2.21 mengimplementasikannya di bawah
sysdeps/posix/timespec_get.c
dan meneruskan langsung ke:clock_gettime
danCLOCK_REALTIME
POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html , danman clock_gettime
mengatakan bahwa ukuran ini mungkin memiliki diskontinuitas jika Anda mengubah pengaturan waktu sistem saat program Anda berjalan.C ++ 11 chrono
Karena kita sudah siap, mari kita bahas juga: http://en.cppreference.com/w/cpp/chrono
GCC 5.3.0 (C ++ stdlib ada di dalam sumber GCC):
high_resolution_clock
adalah alias untuksystem_clock
system_clock
meneruskan ke yang pertama dari yang berikut ini yang tersedia:clock_gettime(CLOCK_REALTIME, ...)
gettimeofday
time
steady_clock
meneruskan ke yang pertama dari yang berikut ini yang tersedia:clock_gettime(CLOCK_MONOTONIC, ...)
system_clock
Ditanyakan pada: Perbedaan antara std :: system_clock dan std :: stable_clock?
CLOCK_REALTIME
vsCLOCK_MONOTONIC
: Perbedaan antara CLOCK_REALTIME dan CLOCK_MONOTONIC?sumber