2013-01-31 8 views
8

MEXを使用してコンパイルした後、私はMATLABという形式のCコードを書きました。 Cコードの中に、私は次のコードを使用して計算の一部の時間を測定:MATLABのtic-tocとCのクロックの不一致

clock_t begin, end; 
double time_elapsed; 
begin = clock(); 
/* do stuff... */ 
end = clock(); 
time_elapsed = (double) ((double) (end - begin)/(double) CLOCKS_PER_SEC); 

経過時間が秒単位の実行時間でなければなりません。

次に、値time_elapsedをMATLABに出力します(適切にエクスポートされていますが、チェックしました)。それから、MATLAB側では、このC関数を(MEXを使用してコンパイルした後に)呼び、tictocを使用して実行時間を測定します。完全に不合理であることが判明したのは、ticとtocを使って計算した時間が0.0011s(500回の実行では平均、st。dev。1.4e-4)、Cコードから返される時間は0.037秒平均500回、st。dev。0.0016)。

は、ここに1つ、2つの非常に奇妙な事実に気づくことがあります。

  1. を関数全体の実行時間は、コードの一部の実行時間よりも低くなっています。したがって、MATLABまたはCのいずれかの測定値は非常に不正確です。
  2. Cコードで測定された実行時間は非常にばらつきがあり、非常に高いstを示します。偏差(変動係数44%、tic-tocのわずか13%)。

これらのタイマーでは何が起こっていますか?

+0

時計の解像度はどのくらいですか? 'begin = clock();'がクロックティックの直前または直後に実行されるかどうかをどのように知ることができますか?それが結果に影響しますか?多分。 –

+0

@BoPerssonだから、 'clock()'がたぶんチックに間違っているかもしれないということですか? –

+4

1つのティックが結果に影響を及ぼすほど大きくなることがあります。 18 msのように。 –

答えて

6

あなたはリンゴとオレンジを比較しています。

MATLABのドキュメントを参照:

チックからhttp://www.mathworks.com/help/matlab/ref/tic.html
TOCからhttp://www.mathworks.com/help/matlab/ref/toc.html

チックTOCは、あなたが本当の経過時間を計測してみましょう。

今度は時計の機能http://linux.die.net/man/3/clockを見てください。特に

クロック()関数は、プログラムによって使用されるプロセッサ時間の近似値を返します。

返される値は、これまでにをclock_tとして使用したCPU時間です。 〜 使用する秒数を取得し、CLOCKS_PER_SECで除算します。 プロセッサ時間が使用できない場合、またはその値を にすることができない場合、この関数は(clock_t)-1の値を返します。

だからあなたの違いを占めることができるもの:

  • のCPU(クロックによって測定された())時間と(TICとTOCによって測定される)実際の経過時間は同じではありません。だからあなたは、CPU時間が経過時間よりも短くなると期待していますか?まあ、たぶん。0.0011秒以内に100コアで10コアを稼動させるとどうなりますか?これは、clock()測定がticとtocで測定された10倍であることを意味します。可能性は低いです。
  • クロック(。)は大雑把に不正確で、文書と一致して、おおよそcpu時間測定です!私はそれがスケジューラーの量子サイズに固定されていると思うが、私は確認するためにLinuxカーネルコードを調べなかった。私も他のOSをチェックしなかったが、this dude's blogはその理論と一貫している。

だから何をすればいいのでしょうか?まず、リンゴとリンゴを比較してください!次に、タイマー解決を考慮に入れてください。

関連する問題