Apa perbedaan antara std::system_clock
dan std::steady_clock
? (Contoh kasus yang menggambarkan hasil / perilaku berbeda akan sangat bagus).
Jika tujuan saya adalah mengukur waktu eksekusi fungsi secara tepat (seperti tolok ukur), apa pilihan terbaik antara std::system_clock
, std::steady_clock
dan std::high_resolution_clock
?
system_clock
tidak stabil di Windows. Di Windows, waktu sistem dapat diubah menjadi nilai arbitrer oleh pengguna yang memiliki hak istimewa yang memadai. Selain itu, layanan sinkronisasi waktu dapat menyesuaikan waktu sistem mundur jika diperlukan. Saya berharap sebagian besar platform lain memiliki fitur serupa yang memungkinkan penyesuaian waktu sistem.Jawaban:
Dari N3376:
20.11.7.1 [time.clock.system] / 1:
20.11.7.2 [jam.stabil] / 1:
20.11.7.3 [time.clock.hires] / 1:
Misalnya, jam lebar sistem mungkin dipengaruhi oleh sesuatu seperti waktu musim panas, di mana waktu aktual yang tercantum di beberapa titik di masa mendatang sebenarnya bisa menjadi waktu di masa lalu. (Misalnya di AS, pada musim gugur waktu bergerak mundur satu jam, sehingga jam yang sama dialami "dua kali") Namun,
steady_clock
tidak diperbolehkan untuk terpengaruh oleh hal-hal seperti itu.Cara berpikir lain tentang "mantap" dalam hal ini adalah dalam persyaratan yang ditentukan dalam tabel 20.11.3 [time.clock.req] / 2:
Hanya itu yang dimiliki standar tentang perbedaan mereka.
Jika Anda ingin melakukan benchmarking, taruhan terbaik Anda mungkin adalah
std::high_resolution_clock
, karena kemungkinan platform Anda menggunakan timer resolusi tinggi (misalnyaQueryPerformanceCounter
pada Windows) untuk jam ini. Namun, jika Anda melakukan benchmarking, Anda harus benar-benar mempertimbangkan untuk menggunakan timer khusus platform untuk benchmark Anda, karena platform yang berbeda menangani hal ini secara berbeda. Misalnya, beberapa platform mungkin memberi Anda beberapa cara untuk menentukan jumlah clock sebenarnya dari program yang diperlukan (terlepas dari proses lain yang berjalan pada CPU yang sama). Lebih baik lagi, dapatkan profiler asli dan gunakan itu.sumber
steady_clock
dan disystem_clock
sini.system_clock
UTC.Billy memberikan jawaban yang bagus berdasarkan standar ISO C ++ yang saya setujui sepenuhnya. Namun ada sisi lain dari cerita ini - kehidupan nyata. Tampaknya saat ini tidak ada perbedaan antara jam-jam tersebut dalam implementasi kompiler populer:
gcc 4.8:
Visual Studio 2012:
Dalam kasus gcc, Anda dapat memeriksa apakah Anda menggunakan jam yang stabil hanya dengan memeriksa
is_steady
dan berperilaku sesuai. Namun VS2012 tampaknya sedikit curang di sini :-)Jika Anda memerlukan jam presisi tinggi, saya sarankan untuk saat ini menulis jam Anda sendiri yang sesuai dengan antarmuka jam resmi C ++ 11 dan menunggu implementasi menyusul. Ini akan menjadi pendekatan yang jauh lebih baik daripada menggunakan API khusus OS secara langsung di kode Anda. Untuk Windows Anda dapat melakukannya seperti itu:
Untuk Linux bahkan lebih mudah. Cukup baca halaman manual
clock_gettime
dan ubah kode di atas.sumber
Penerapan 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
Lalu
CLOCK_REALTIME
vsCLOCK_MONOTONIC
dijelaskan di: Perbedaan antara CLOCK_REALTIME dan CLOCK_MONOTONIC?sumber
Mungkin, perbedaan yang paling signifikan adalah fakta bahwa titik awalnya
std::chrono:system_clock
adalah 1.1.1970, yang disebut UNIX-epoch. Di sisi lain,std::chrono::steady_clock
biasanya untuk waktu boot PC Anda dan paling cocok untuk mengukur interval.sumber