2016-12-27 94 views
0

每當我打電話: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上。

謝謝。

+0

但是隻有一個調用QueryPerformanceFrequency,第二個是哪裏? – Rakete1111

+0

這看起來更像一個編譯器特定的問題,而不是C++標準問題。 我建議你編輯你的標誌,也許指定你使用的是什麼編譯器和版本(Visual Studio IDE可能使用不同的編譯器)。 另外,因爲我認爲採用Visual C提供的C++庫++是由微軟生產的,它們可能* *知道最好的做法,用QueryPerformanceFrequency的()。 – roalz

+0

@Rakete它在循環中,我知道它每次都在循環中調用它。 – Zebrafish

回答

1

VS的優化器似乎沒有把QueryPerformanceFrequency的調用放在循環之外。它不認識到輸出在第一次迭代後每次迭代都是一樣的,所以它不能優化它,任何理智的優化器都會這樣做:)

可能是缺少的功能或某種東西,而不是錯誤我想,我會說,VS優化呼叫foo這裏的循環之外(我沒有在時刻訪問VS,所以我無法測試):

int value = 0; 
void foo() { value = 2; } 

for (int i = 0; i < 10; ++i) { 
    foo(); 
    std::cout << i * value << '\n'; 
} 

原因爲什麼沒有調用QueryPerformance*函數是在Debug中,優化器不允許進行優化。優化器認爲對本機Windows API的調用比對標準庫實現的調用要快,因此它會替換相應的調用。

相關問題