Saya baru-baru ini memutuskan bahwa saya perlu mengubah dari menggunakan milidetik ke mikrodetik untuk kelas Timer saya, dan setelah beberapa penelitian, saya memutuskan bahwa QueryPerformanceCounter mungkin adalah taruhan teraman saya. (Peringatan Boost::Posix
bahwa itu mungkin tidak berfungsi pada Win32 API membuat saya pergi sedikit). Namun, saya tidak begitu yakin bagaimana menerapkannya.
Yang saya lakukan adalah memanggil GetTicks()
fungsi esque apa pun yang saya gunakan dan menugaskannya ke startingTicks
variabel Timer . Kemudian untuk menemukan jumlah waktu yang berlalu, saya hanya mengurangi nilai kembalian fungsi dari startingTicks
, dan ketika saya mengatur ulang pengatur waktu, saya hanya memanggil fungsi itu lagi dan menetapkan startingTicks ke sana. Sayangnya, dari kode yang saya lihat tidak sesederhana hanya menelepon QueryPerformanceCounter()
, dan saya tidak yakin apa yang harus saya sampaikan sebagai argumennya.
Jawaban:
Program ini harus mengeluarkan angka mendekati 1000 (windows sleep tidak terlalu akurat, tapi seharusnya seperti 999).
The
StartCounter()
Fungsi mencatat jumlah kutu counter kinerja memiliki dalamCounterStart
variabel. TheGetCounter()
fungsi mengembalikan jumlah milidetik sejakStartCounter()
terakhir disebut sebagai ganda, jadi jikaGetCounter()
kembali 0.001 maka itu sudah sekitar 1 mikrodetik sejakStartCounter()
dipanggil.Jika Anda ingin menggunakan pengatur waktu, gunakan detik, lalu ubah
untuk
atau jika Anda ingin mikrodetik kemudian gunakan
Tapi sebenarnya ini tentang kenyamanan karena mengembalikan ganda.
sumber
On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL).
Kode ini tidak terlalu cacat, tetapi beberapa BIOS atau HAL.StartCounter
fungsi:old_mask = SetThreadAffinityMask(GetCurrentThread,1);
dan kemudian mengaturnya kembali di akhirSetThreadAffinityMask ( GetCurrentThread , old_mask ) ;
. Saya harap itu akan berhasil. Ini seharusnya mencegah utas saya dijadwalkan ulang ke apa pun kecuali inti CPU pertama. (Yang jelas hanya solusi untuk lingkungan pengujian)Saya menggunakan definisi ini:
Penggunaan (tanda kurung untuk mencegah definisi ulang):
Output dari contoh penggunaan:
sumber
Dengan asumsi Anda menggunakan Windows (jika demikian, Anda harus menandai pertanyaan Anda seperti itu!), Pada halaman MSDN ini Anda dapat menemukan sumber untuk
HRTimer
kelas C ++ sederhana dan berguna yang membungkus panggilan sistem yang diperlukan untuk melakukan sesuatu yang sangat dekat dengan apa yang Anda butuhkan (itu akan mudah untuk menambahkanGetTicks()
metode untuk itu, khususnya, untuk melakukan persis apa yang Anda butuhkan).Pada platform non-Windows, tidak ada fungsi QueryPerformanceCounter, jadi solusinya tidak akan langsung portabel. Namun, jika Anda membungkusnya dalam kelas seperti yang disebutkan di atas
HRTimer
, akan lebih mudah untuk mengubah implementasi kelas untuk menggunakan apa yang memang dapat ditawarkan platform saat ini (mungkin melalui Boost atau apa pun!).sumber
Saya akan memperluas pertanyaan ini dengan contoh driver NDIS tentang mendapatkan waktu. Seperti yang diketahui, KeQuerySystemTime (meniru di bawah NdisGetCurrentSystemTime) memiliki resolusi rendah di atas milidetik, dan ada beberapa proses seperti paket jaringan atau IRP lain yang mungkin memerlukan stempel waktu yang lebih baik;
Contohnya sesederhana:
dengan pembagi adalah 10 ^ 3, atau 10 ^ 6 tergantung resolusi yang diperlukan.
sumber