Potongan kode berikut:
struct timespec ts;
for (int x = 0; x < 100000000; x++) {
timespec_get(&ts, TIME_UTC);
long cTime = (long) time(NULL);
if (cTime != ts.tv_sec && ts.tv_nsec < 3000000) {
printf("cTime: %ld\n", cTime);
printf("ts.tv_sec: %ld\n", ts.tv_sec);
printf("ts.tv_nsec: %ld\n", ts.tv_nsec);
}
}
menghasilkan output ini:
...
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2527419
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2534036
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2540359
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2547039
...
Mengapa perbedaan antara cTime
dan ts.tv_sec
? Perhatikan bahwa masalah tidak terjadi jika kondisi diubah menjadi ts.tv_nsec >= 3000000
. Masalahnya bergantung pada nanodetik yang lebih kecil dari 3000000.
timespec_get()
? Apakah ini C atau C ++? Sepertinyastd::timespec_get
. Silakan gunakan tag yang sesuai.man
entri untuktimespec_get
di sistem saya jadi saya langsung mengambil kesimpulan. Masuk akal.Jawaban:
Alasannya adalah, bahwa Anda (secara implisit) menggunakan jam sistem yang berbeda.
timespec_get()
menggunakan jam realtime seluruh sistem resolusi tinggi , sementaratime()
menggunakan jam realtime kasar .Coba gunakan
alih-alih Anda
timespec_get()
, maka perbedaannya harus menghilang.Edit:
Ini dapat dilihat di Sumber Kernel Linux, vclock_gettime.c
Memang masalahnya agak halus untuk dilihat di sini. Bagian detik dari anggota struktur yang digunakan oleh
CLOCK_REALTIME_COARSE
danCLOCK_REALTIME
mengandung nilai yang identik, tetapi bagian nanodetik berbeda; denganCLOCK_REALTIME
itu bisa lebih besar dari1000000000
(yaitu satu detik). Dalam hal ini, telepon diperbaiki:Koreksi ini tidak dilakukan dengan
CLOCK_REALTIME_COARSE
, atau dengantime()
. Ini menjelaskan perbedaan antaraCLOCK_REALTIME
dantime()
.sumber
time
yang diimplementasikan dengan (mungkin) jam yang lebih berkinerja tetapi kurang akurat (pada teori itu hanya mendapat rincian kedua, jadi siapa yang butuh ketelitian)? Tertinggal real time sekitar satu milidetik (tes online sesekali menunjukkan keterlambatan lebih dari satu ms, tetapi tidak terlalu banyak) ketika Anda hanya meminta rincian kedua tidak terlalu penting menurut saya.