2017-06-12 12 views
4

私のコードで特定の関数を実行するのにかかる時間を測定しようとしました。当初、私はその後、私はC++11chronoライブラリについて読んで最初のコードで測定しclockとsteady_clockで測定した時間の差

using namespace std::chrono; 

auto start = steady_clock::now(); 
do_something(); 
auto end = steady_clock::now(); 
printf("Time taken: %lld ms\n", duration_cast<milliseconds>(end - start).count()); 

時間以下のようにstd::chrono::steady_clockと同じ測定を試みた

clock_t start = clock(); 
do_something(); 
clock_t end = clock(); 

printf("Time taken: %f ms\n", ((double) end - start)*1000/CLOCKS_PER_SEC); 

以下のようにclock()機能を使用しましたスニペット(clockを使用)は89.53 msであり、steady_clockで測定されたスニペットは1140 msでした。

なぜ、両方の時計で測定された時間に大きな違いがありますか?

+0

可能であれば、[mcve]を作成できますか? – Rakete1111

+0

@ Rakete1111:問題が再現可能な小さなテストケースへの[link](http://coliru.stacked-crooked.com/a/9f74e57079978629)です。 –

答えて

5

clockはプロセッサ時間を測定します。一方、steady_clockは物理時間を測定します。したがって、do_something()が他のプロセス(メールのチェックなど)によって差し替えられた場合、このような違いを得ることができます。

Daniel Hコメントには、do_something()がCPUにバインドされていない場合にもこのようなことが起こる可能性があるという点で、大きな点があります。たとえば、スリープしている場合、mutexをロックするブロック、条件変数を待つなど。

+2

それはまた、 'do_something'というIDがCPUにバインドされていないことを示します。 –

+0

@ダニエルH:ありがとうダニエル、良い点。私は私の答えにあなたのコメントを追加しました。 –

+0

@HowardHinnantスリープできる関数、ミューテックスのブロックなどの時間を測定する正しい方法は何でしょうか? –

関連する問題