Bagaimana cara mendapatkan waktu saat ini dalam milidetik dari C di Linux?

89

Bagaimana cara mengetahui waktu saat ini di Linux dalam milidetik?

LLL
sumber

Jawaban:

102

Ini dapat dicapai dengan menggunakan fungsi POSIXclock_gettime .

Dalam versi saat ini dari POSIX, gettimeofdayyang ditandai usang . Artinya, ini dapat dihapus dari versi spesifikasi yang akan datang. Penulis aplikasi didorong untuk menggunakan clock_gettimefungsi tersebut daripada gettimeofday.

Berikut adalah contoh cara menggunakan clock_gettime:

Jika tujuan Anda adalah untuk mengukur waktu yang telah berlalu, dan sistem Anda mendukung opsi "jam monotonik", Anda harus mempertimbangkan untuk menggunakan CLOCK_MONOTONICdaripada CLOCK_REALTIME.

Dan Molding
sumber
7
1 karena POSIXly benar - tetapi jawaban Anda memiliki satuan yang salah. OP tidak ingin waktu dengan milidetik, tapi waktu di milidetik.
pilcrow
5
Solusi bagus tapi jangan lupa -lm dalam gccperintah Anda .
David Guyon
2
menurut halaman manual untuk round, Anda ingin menggunakan lround saat menetapkan hasil ke integer (atau long)
hildred
2
Anda perlu menggunakan floor () daripada round () sehingga tidak pernah membulatkan hingga 1000 md. Jika tidak, Anda perlu menambah ssaat ini terjadi. Mungkin kejadian langka tetapi digit ekstra dapat menyebabkan masalah.
Mike
1
@Ike Bagus menangkap. Pada satu dari dua ribu, itu bahkan tidak jarang, jadi harus diperbaiki. Daripada menggunakan lantai, saya pikir saya lebih suka mempertahankan sedikit lebih akurat dan terus membulatkan, tetapi menambah penghitung kedua jika membulatkan menjadi 1000.
Dan Molding
60

Anda harus melakukan sesuatu seperti ini:

yadab
sumber
33

Berikut adalah fungsi util untuk mendapatkan stempel waktu saat ini dalam milidetik:

Tentang zona waktu :

gettimeofday () mendukung untuk menentukan zona waktu, saya menggunakan NULL , yang mengabaikan zona waktu, tetapi Anda dapat menentukan zona waktu, jika perlu.


@Update - zona waktu

Karena longrepresentasi waktu tidak relevan atau dipengaruhi oleh zona waktu itu sendiri, maka pengaturan tzparameter gettimeofday () tidak diperlukan, karena tidak akan membuat perbedaan apa pun.

Dan, menurut pria halaman gettimeofday(), penggunaan timezonestruktur adalah usang, sehingga tzargumen biasanya harus ditetapkan sebagai NULL, untuk rincian silahkan periksa halaman manual.

Trump 2020 - Keadilan akan datang
sumber
1
> gettimeofday () dukungan untuk menentukan zona waktu, saya menggunakan NULL, yang mengabaikan zona waktu, tetapi Anda dapat menentukan zona waktu, jika perlu. Anda salah. Zona waktu harus diperkenalkan secara eksklusif melalui panggilan ke localtime ().
vitaly.v.ch
@ vitaly.v.ch Saya melakukan tes, melewati tzparameter gettimeofday()as &(struct timezone tz = {480, 0})tidak akan mendapatkan peringatan apa pun, dan tidak berpengaruh apa pun pada hasilnya, itu masuk akal, karena longrepresentasi waktu tidak relevan atau terpengaruh berdasarkan zona waktu itu sendiri, bukan?
Trump 2020 - Keadilan akan datang pada
Tidak ada alasan untuk melakukan tes apapun. Kernel Linux tidak memiliki informasi yang tepat tentang zona waktu, dan pada saat yang sama tidak memiliki cara untuk menyediakannya. Itu alasan mengapa argumen tz diproses dengan cara yang sangat spesifik. representasi panjang tidak masalah.
vitaly.v.ch
@ vitaly.v.ch Pada titik waktu tertentu, representasi panjang tidak bervariasi karena zona waktu, itulah mengapa itu penting, dan karena itu biasanya hanya NULLnilai yang masuk akal untuk dilewati. Dan, saya percaya pengujian selalu merupakan pendekatan yang baik untuk membuktikan sesuatu.
Trump 2020 - Keadilan akan datang pada
13

Gunakan gettimeofday()untuk mengetahui waktu dalam detik dan mikrodetik. Menggabungkan dan membulatkan ke milidetik tersisa sebagai latihan.

Donal Fellows
sumber
7

C11 timespec_get

Ini mengembalikan hingga nanodetik, dibulatkan ke resolusi implementasi.

Ini sudah diterapkan di Ubuntu 15.10. API terlihat sama dengan POSIX clock_gettime.

Detail lebih lanjut di sini: https://stackoverflow.com/a/36095407/895245

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
1

Berasal dari jawaban POSIX Dan Moulding, ini seharusnya berfungsi:

Juga seperti yang ditunjukkan oleh David Guyon: kompilasi dengan -lm

Jirka Justra
sumber
0

Versi ini tidak membutuhkan pustaka matematika dan memeriksa nilai kembalian clock_gettime ().

FH0
sumber
1
Sebutkan apa jawaban Anda atas 6 jawaban lainnya (khususnya, karena 2 jawaban lain sudah diandalkan clock_gettime), tambahkan tajuk mana yang diperlukan, dan dengan cara apa jawaban itu menjawab pertanyaan OP. Mengenai CLOCK_MONOTONIC, saya juga akan merekomendasikan penggunaan makro standar langsung dalam jawaban Anda (dan dalam kode Anda, secara umum) daripada literal.
PiCTo
1
Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan tersebut meningkatkan nilai jangka panjangnya.
Donald Duck