2016-09-12 8 views
4

私はC++コードのタイミングのための簡単なテストを実行していましたが、100%肯定的ではないアーティファクトを実行しました。コードのLinux時間とパフォーマンスクロックの差

セットアップ

私のコードは、経過時間を測定するためにC++ 11 high_resolution_clockを使用しています。また、私のプログラムの実行を、Linuxのtimeコマンド(/usr/bin/time)を使ってラップします。私のプログラムの場合、time〜7s(〜6.5sユーザーと〜.5sシステム)の間にhigh_resolution_clockは〜2sを報告します。また、冗長オプションを使用すると、私のプログラムは1つの自発的コンテキストスイッチと10つの非自発的コンテキストスイッチ(/usr/bin/time -v)でCPUの100%を使用していました。

質問

私の質問は、OS時間の測定とパフォーマンス時間の測定値との間のこのような劇的な差が生じる何ですか?オペレーティング・システムの私の知識を通じて

私の最初の考え

、私は(time -vで述べたように)、これらの違いは、単に他のプログラムとコンテキストスイッチによって引き起こされると仮定しています。

これがこの違いの唯一の理由ですか?コードのパフォーマンスを見ていると、自分のプログラムやシステムで報告された時間を信頼する必要がありますか?

また、私の前提は、自分のプログラムのCPU使用以上の時間がかかるため、Linuxの時間よりも自分のプログラムの計算時間を信頼することです。

警告

  • それは手元の問題には本当に関係がないように私は、コードを投稿していないです。あなたが知りたいのであれば、100,000,000回のランダムな浮動小数点算術演算を行う単純なテストです。

  • 私のC++コード内の他の時計は、相違する状況(this stack overflow question)に多かれ少なかれ適切かもしれません。 High_resolution_clockは単なる例です。

編集:コード要求

#include <chrono> 
#include <cstdlib> 
#include <iostream> 
#include <vector> 

using namespace std; 
using namespace std::chrono; 

int main() { 
    size_t n = 100000000; 

    double d = 1; 

    auto start_hrc = high_resolution_clock::now(); 

    for(size_t i = 0; i < n; ++i) { 
    switch(rand() % 4) { 
     case 0: d += 0.0001; break; 
     case 1: d -= 0.0001; break; 
     case 2: d *= 0.0001; break; 
     case 3: d /= 0.0001; break; 
    } 
    } 

    auto end_hrc = high_resolution_clock::now(); 
    duration<double> diff_hrc = end_hrc - start_hrc; 
    cout << d << endl << endl; 
    cout << "Time-HRC: " << diff_hrc.count() << " s" << endl; 
} 
+0

time' 'の最初の出力は、コンテキストスイッチがあった場合のように、しばらく時間がかかる可能性があり、プログラム終了までのプログラム開始からのクロック時間になります。

ませ劇的な違いは、私のデスクトップ上に観察されませんと述べた。あなたのスレッドが眠っている間も眠っている可能性が高いので、私はhigh_resolution_clockを信頼します。コードを表示したくないと言ったことは知っていますが、タイミングをどのように計測したかを正確に把握できればいいので、コードはそれに適しています。 – AndyG

+0

私は見つけたhigh_resolution_clock上のすべてのチュートリアルとあまり変わらないタイミングをアップロードしました。 – pippin1289

+0

私が間違っていれば私を訂正してください。しかし、コードの前提では、ティック数は秒を表していますか? 'std :: chrono :: duration_cast (end_hrc-start_hrc)'を使った場合の出力は? – AndyG

答えて

0

として私の質問は、OSの時間測定とパフォーマンス時間の測定値との間のこのような劇的な差が生じる何ですか?

アプリケーションの起動に時間がかかるようです。おそらくリソースの問題です:十分な空きメモリ(スワッピング)またはオーバーサブスクライブされたCPUではありません。

Time-HRC: 1.39005 s 
real 0m1.391s 
user 0m1.387s 
sys  0m0.004s