私は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;
}
time' 'の最初の出力は、コンテキストスイッチがあった場合のように、しばらく時間がかかる可能性があり、プログラム終了までのプログラム開始からのクロック時間になります。
ませ劇的な違いは、私のデスクトップ上に観察されませんと述べた。あなたのスレッドが眠っている間も眠っている可能性が高いので、私はhigh_resolution_clockを信頼します。コードを表示したくないと言ったことは知っていますが、タイミングをどのように計測したかを正確に把握できればいいので、コードはそれに適しています。 – AndyG
私は見つけたhigh_resolution_clock上のすべてのチュートリアルとあまり変わらないタイミングをアップロードしました。 – pippin1289
私が間違っていれば私を訂正してください。しかし、コードの前提では、ティック数は秒を表していますか? 'std :: chrono :: duration_cast(end_hrc-start_hrc)'を使った場合の出力は? –
AndyG