2017-08-10 10 views
0

C++プログラムのプロファイリングを行い、その目的でhigh_resolution_clockを使用しました。その問題のサンプルコードが例として提供されています。私は3つの異なる方法を試しました。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用クロックとうまく機能予想通り、結果を与えます。この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; 
} 

私は疑問0時間を示しています。このexample

例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; 
} 

3792420263マイクロ私も疑問を示しています。

example 2example 3の問題は何ですか?どちらが正しいか。

答えて

0

コンパイラは、それらのループを最適化します。 [オプション]メニューの[最適化]を無効にした場合は、妥当な値が表示されます。

1

例2はコンパイラによって最適化されるため、ループ実行時間を確認するには、コンパイラの最適化を無効にする必要があります。

例3は、すべてのループに異なる時間を追加し、結果がループ実行時間について何も表示しないため、意味をなさない。さらに、ループ中に32ビットのunsigned int ttimeでオーバーフローが発生します。

実際のコードをプロファイリングする最適なソリューションはです。例2です。ゼロ出力を心配する必要はありません。t1t2の間に「合理的なコード」を追加すると、より良い数字が得られます。

関連する問題