2017-08-10 24 views
0

我想剖析我的C++程序,並使用high_resolution_clock來達到此目的。這方面的示例代碼僅作爲示例提供。我嘗試了三種不同的方式。使用high_resolution_clock分析C++程序

實施例1

#include<iostream> 
#include <chrono> 

using namespace std; 
using namespace chrono; 

unsigned int ttime = 0; 
int main(){ 
    int i = 0; 
    int j = 0; 
    while(i < 10000000){ 
     high_resolution_clock::time_point t1 = high_resolution_clock::now(); 
     j += i;  
     i++; 
     high_resolution_clock::time_point t2 = high_resolution_clock::now(); 
     auto tm_duration = duration_cast<microseconds>(t2 - t1).count(); 
     ttime += tm_duration; 
    } 
    cout << "Took " << ttime << " microseconds " << endl; 
    return 0; 
} 

在循環內該example使用時鐘和效果良好,給出的結果如預期。

實施例2

#include<iostream> 
#include <chrono> 

using namespace std; 
using namespace chrono; 

unsigned int ttime = 0; 
int main(){ 
    int i = 0; 
    int j = 0; 
    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 
    while(i < 10000000){ 
     j += i;  
     i++; 
    } 
    high_resolution_clock::time_point t2 = high_resolution_clock::now(); 
    auto tm_duration = duration_cast<microseconds>(t2 - t1).count(); 
    ttime += tm_duration; 
    cout << "Took " << ttime << " microseconds " << endl; 
    return 0; 
} 

example顯示0時間,我懷疑的。

實施例3

#include<iostream> 
#include <chrono> 

using namespace std; 
using namespace chrono; 

unsigned int ttime = 0; 
int main(){ 
    int i = 0; 
    int j = 0; 
    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 
    while(i < 10000000){ 
     j += i;  
     i++; 
     high_resolution_clock::time_point t2 = high_resolution_clock::now(); 
     auto tm_duration = duration_cast<microseconds>(t2 - t1).count(); 
     ttime += tm_duration; 
    } 
    cout << "Took " << ttime << " microseconds " << endl; 
    return 0; 
} 

example顯示3792420263微秒我也懷疑。

example 2example 3有什麼問題。哪三個是正確的。

回答

0

編譯器優化了那些循環。如果您在選項菜單中禁用了優化,它將顯示合理的值。

1

示例2通過編譯器得到優化,所以如果您想查看循環運行時間,應該禁用任何編譯器優化。

示例3是沒有意義的,因爲您在每個循環中添加了不同的時間,結果是沒有提及循環運行時間的數字。此外,在32位unsigned int ttime循環中遇到很多溢出。

因此,剖析真實代碼的最佳解決方案是示例2。不要擔心你的零輸出,如果你在t1t2創建之間添加任何「合理代碼」,你會得到更好的數字。