2016-08-17 25 views
0

私はこのメソッドを使用しています:Measure execution time in C (on Windows)すべてのスレッドの実行時間を測定します。私はWindowsで、VC++を使っています。このようなスレッド変更の実行時間

何か:

//initialize start, end, frequency 
std::thread thread1(...); 
// and so on I initialise all the threads 

thread1.join(); 
//join all threads 

//time = (start-end)/frequency 
printf(time); 

は、私はそれを複数回実行し、私は多くの場合、異なる実行時間を取得します。私は30%のバリエーションを持っています(これは100から70の間の値を取得することを意味します)。なぜ私は理解できないのですか? 30%は小さな変化ではありません。

おかげ

+1

どのように時間を測定しますか?後者がシステム負荷に依存するため、天文学を測定する場合はプロセッサ時間を測定することを検討してください。 – alexeykuzmin0

+0

時間測定の分解能は、スケジューリングおよびその他の要因によって制限されます。スレッド実行時間が短いほど、タイミングが不正確になります。私は平均的に多くの走りを取るだろう。 – Robinson

+0

@ alexeykuzmin0質問の回答と同じ私はペーストをコピーしました。 QueryPerformanceCounterの使用。 – userDS

答えて

0

多くのものが、システムの負荷から揃える星のメモリ使用量に、実行時間に影響を与えることができます。あなたは実行時間の順番を指定しませんが、値が小さい場合は30%の偏差は確かに聞こえません。主な奪い取りは、それ自体の実行時間は基本的にシステムについて何も教えてくれないということです。

+0

あなたの言っていることは、私のプログラムを実行するのにどれくらいの時間がかかりますか?私の場合、正確な実行時間を知ることは本当に重要なので、ありがとう – userDS

+1

一般的なケースでは「正確な実行時間」はありません。複数回実行したり平均したりすることもできますし、1回の実行で時間を取ることもできますが、一般的なケースでは「このプログラムは実行にN秒かかる」とは言えません。 – Sinkingpoint

+0

@userDS *正確な実行時間*は、リアルタイムオペレーティングシステムと呼ばれるもののプロパティです。 Windowsはその1つではありません。それは、ディスクやネットワークのような低速のリソースにアクセスする場合を除いて、30代のバリエーションが疑わしいと述べています。だから調査してください。何か魚がいる。 – UmNyobe

0

QueryPerformanceCounterはシステム全体のカウンタであるため、結果はシステムの負荷とプロセススケジューリングの詳細によって異なります。

あなたは

プロセスのスレッドが使用するCPUクロックサイクル数を返しQueryProcessCycleTimeを、使用することができます。この値には、ユーザーモードとカーネルモードの両方で消費されたサイクルが含まれます。

GetCurrentProcessを使用すると、現在のプロセスのハンドルを取得できます。

+0

HANDLE ProcessHandleとして渡すべきは何ですか?このハンドルオブジェクトを作成するにはどうしたらいいですか?ありがとう – userDS

+0

@userDS編集を参照してください。 – molbdnilo

関連する問題