每當我打電話:std :: chrono反覆調用QueryPerformanceFrequency?
std::chrono::high_resolution_clock::now().time_since_epoch().count();
它的彙編指令是:
std::chrono::high_resolution_clock::now().time_since_epoch().count();
00007FF7D9E11840 call qword ptr [__imp__Query_perf_frequency (07FF7D9E14090h)]
00007FF7D9E11846 call qword ptr [__imp__Query_perf_counter (07FF7D9E140A0h)]
我以前使用過Windows API的時鐘,我認爲正確的方法是查詢頻率一次。
在微軟的文檔,它說:
QueryPerformanceFrequency的檢索性能計數器 的頻率。性能計數器的頻率在系統啓動時固定爲 ,並且在所有處理器中保持一致。因此,只需要在應用程序初始化時查詢頻率 ,並且可以高速緩存結果 。
這是一個循環,所以我認爲對QueryPerformanceFrequency的調用是重複的。這是建立在釋放模式和/ O2優化。
另外,如果我建在調試模式下,它提出了以下組件:
std::chrono::high_resolution_clock::now().time_since_epoch().count();
00007FF774FC9D19 lea rcx,[rbp+398h]
00007FF774FC9D20 call std::chrono::steady_clock::now (07FF774FB1226h)
00007FF774FC9D25 lea rdx,[rbp+3B8h]
00007FF774FC9D2C mov rcx,rax
00007FF774FC9D2F call std::chrono::time_point<std::chrono::steady_clock,std::chrono::duration<__int64,std::ratio<1,1000000000> > >::time_since_epoch (07FF774FB143Dh)
00007FF774FC9D34 mov rcx,rax
00007FF774FC9D37 call std::chrono::duration<__int64,std::ratio<1,1000000000> >::count (07FF774FB1361h)
我不明白組裝,我不知道爲什麼在發行模式也有對Windows API調用並且在調試模式下沒有提及它。另外,我在Visual Studio上。
謝謝。
但是隻有一個調用QueryPerformanceFrequency,第二個是哪裏? – Rakete1111
這看起來更像一個編譯器特定的問題,而不是C++標準問題。 我建議你編輯你的標誌,也許指定你使用的是什麼編譯器和版本(Visual Studio IDE可能使用不同的編譯器)。 另外,因爲我認爲採用Visual C提供的C++庫++是由微軟生產的,它們可能* *知道最好的做法,用QueryPerformanceFrequency的()。 – roalz
@Rakete它在循環中,我知道它每次都在循環中調用它。 – Zebrafish