Di Windows, clock()
mengembalikan waktu dalam milidetik, tetapi di kotak Linux yang sedang saya kerjakan, ini membulatkannya ke 1000 terdekat sehingga presisi hanya ke tingkat "kedua" dan bukan ke tingkat milidetik.
Saya menemukan solusi dengan Qt menggunakan QTime
kelas, membuat instance objek dan memanggilnya start()
kemudian memanggil elapsed()
untuk mendapatkan jumlah milidetik yang telah berlalu.
Saya agak beruntung karena saya bekerja dengan Qt untuk memulai, tetapi saya ingin solusi yang tidak bergantung pada pustaka pihak ketiga,
Apakah tidak ada cara standar untuk melakukan ini?
MEMPERBARUI
Tolong jangan rekomendasikan Boost ..
Kalau Boost dan Qt bisa melakukannya, tentunya bukan sihir, pasti ada standar yang mereka gunakan!
Jawaban:
Anda bisa menggunakan gettimeofday di awal dan akhir metode Anda dan kemudian membedakan dua struktur pengembalian. Anda akan mendapatkan struktur seperti berikut:
EDIT: Seperti yang disarankan oleh dua komentar di bawah ini, clock_gettime (CLOCK_MONOTONIC) adalah pilihan yang jauh lebih baik jika Anda memilikinya, yang seharusnya ada di hampir semua tempat saat ini.
EDIT: Orang lain berkomentar bahwa Anda juga dapat menggunakan C ++ modern dengan std :: chrono :: high_resolution_clock, tetapi itu tidak dijamin monotonik. Gunakan jam stabil sebagai gantinya.
sumber
CLOCK_MONOTONIC
bagus untuk menghindari penyesuaian waktu sistem yang dilokalkan.sumber
POSIX.1-2008 marks gettimeofday() as obsolete, recommending the use of clock_gettime(2) instead.
@CTT, bisa Anda memperbarui contoh dengan mengubahstruct timeval
kestruct timespec
, dangettimeofday(&start, NULL)
untukclock_gettime(CLOCK_MONOTONIC, &start)
agar orang tidak mengalami kesulitan?Harap dicatat bahwa
clock
tidak tidak mengukur waktu jam dinding. Itu berarti jika program Anda membutuhkan waktu 5 detik,clock
tidak akan mengukur 5 detik, tetapi bisa lebih (program Anda dapat menjalankan beberapa utas sehingga dapat menggunakan lebih banyak CPU daripada waktu nyata) atau kurang. Ini mengukur perkiraan waktu CPU yang digunakan. Untuk melihat perbedaannya perhatikan kode iniIni dihasilkan di sistem saya
Karena yang kami lakukan hanyalah tidur dan tidak menggunakan waktu CPU! Namun, menggunakan
gettimeofday
kita mendapatkan apa yang kita inginkan (?)Keluaran di sistem saya
Jika Anda membutuhkan lebih banyak presisi tetapi ingin mendapatkan waktu CPU , maka Anda dapat mempertimbangkan untuk menggunakan
getrusage
fungsi tersebut.sumber
sleep()
- Saya sudah berpikir untuk mengajukan pertanyaan (mengapa ini berfungsi dengan baik untuk semua orang kecuali saya ?!) , ketika menemukan jawaban Anda.Saya juga merekomendasikan alat yang ditawarkan oleh Boost. Baik Boost Timer yang disebutkan, atau retas sesuatu dari Boost.DateTime atau ada perpustakaan baru yang diusulkan di kotak pasir - Boost.Chrono : Yang terakhir ini akan menjadi pengganti Timer dan akan menampilkan:
duration
time_point
system_clock
monotonic_clock
high_resolution_clock
timer
, dengan typedefs:system_timer
monotonic_timer
high_resolution_timer
process_clock
, merekam waktu nyata, CPU pengguna, dan CPU sistem.process_timer
, merekam waktu nyata, CPU pengguna, dan sistem-CPU yang telah berlalu.run_timer
, pelaporan nyaman dari | process_timer | hasil.Berikut adalah sumber dari daftar fitur
sumber
Saya telah menulis
Timer
kelas berdasarkan jawaban CTT . Ini dapat digunakan dengan cara berikut:Berikut implementasinya:
sumber
Jika Anda tidak memerlukan kode untuk menjadi portabel ke unix lama, Anda dapat menggunakan clock_gettime (), yang akan memberi Anda waktu dalam nanodetik (jika prosesor Anda mendukung resolusi tersebut). Ini POSIX, tapi dari 2001.
sumber
clock () sering kali memiliki resolusi yang cukup buruk. Jika Anda ingin mengukur waktu pada tingkat milidetik, salah satu alternatifnya adalah menggunakan clock_gettime (), seperti yang dijelaskan dalam pertanyaan ini.
(Ingatlah bahwa Anda perlu menghubungkan dengan -lrt di Linux).
sumber
Dengan C ++ 11 dan
std::chrono::high_resolution_clock
Anda dapat melakukan ini:Keluaran:
Tautan ke demo: http://cpp.sh/2zdtu
sumber
clock () tidak mengembalikan milidetik atau detik di linux. Biasanya clock () mengembalikan mikrodetik pada sistem linux. Cara yang tepat untuk menafsirkan nilai yang dikembalikan oleh clock () adalah membaginya dengan CLOCKS_PER_SEC untuk mengetahui berapa lama waktu telah berlalu.
sumber
Ini harus bekerja ... diuji di mac ...
Ya ... jalankan dua kali dan kurangi ...
sumber
Dalam standar POSIX,
clock
nilai kembaliannya ditentukan dalam istilah simbol CLOCKS_PER_SEC dan implementasi bebas untuk mendefinisikan ini dengan cara apa pun yang nyaman. Di Linux, saya cukup beruntung dengantimes()
fungsinya.sumber
gettimeofday - masalahnya adalah itu dapat memiliki nilai yang lebih rendah jika Anda mengubah jam perangkat keras Anda (dengan NTP misalnya) Boost - tidak tersedia untuk jam proyek ini () - biasanya mengembalikan integer 4 byte, yang berarti kapasitasnya rendah, dan setelah beberapa waktu itu mengembalikan angka negatif.
Saya lebih suka membuat kelas saya sendiri dan memperbarui setiap 10 milidetik, jadi cara ini lebih fleksibel, dan saya bahkan dapat meningkatkannya untuk memiliki pelanggan.
untuk menyegarkannya saya menggunakan setitimer:
Lihat setitimer dan ITIMER_VIRTUAL dan ITIMER_REAL.
Jangan gunakan fungsi alarm atau ualarm, Anda akan memiliki presisi yang rendah saat proses Anda membutuhkan kerja keras.
sumber
Saya lebih suka pustaka Boost Timer karena kesederhanaannya, tetapi jika Anda tidak ingin menggunakan pustaka pihak ketiga, menggunakan clock () tampaknya masuk akal.
sumber
Sebagai pembaruan, tampak bahwa pada jam windows () mengukur waktu jam dinding (dengan presisi CLOCKS_PER_SEC)
sedangkan di Linux mengukur waktu cpu di seluruh inti yang digunakan oleh proses saat ini
dan (muncul, dan seperti yang dicatat oleh poster asli) sebenarnya dengan presisi kurang dari CLOCKS_PER_SEC, meskipun mungkin ini tergantung pada versi Linux tertentu.
sumber
Saya suka metode Hola Soy yang tidak menggunakan gettimeofday (). Itu terjadi pada saya di server yang berjalan, admin mengubah zona waktu. Jam telah diperbarui untuk menunjukkan nilai lokal (benar) yang sama. Ini menyebabkan fungsi time () dan gettimeofday () bergeser 2 jam dan semua stempel waktu di beberapa layanan macet.
sumber
Saya menulis
C++
kelas menggunakantimeb
.Fungsi anggota:
Contoh penggunaan:
Output di komputer saya adalah '19'. Keakuratan
msTimer
kelas adalah urutan milidetik. Dalam contoh penggunaan di atas, total waktu eksekusi yang digunakan olehfor
-loop dilacak. Kali ini termasuk sistem operasi yang beralih keluar masuk konteks eksekusimain()
karena multitasking.sumber