Cコードの一部を実行するのにかかる時間をベンチマークする簡単なライブラリはありますか?私が欲しいのは次のようなものです:
int main(){
benchmarkBegin(0);
//Do work
double elapsedMS = benchmarkEnd(0);
benchmarkBegin(1)
//Do some more work
double elapsedMS2 = benchmarkEnd(1);
double speedup = benchmarkSpeedup(elapsedMS, elapsedMS2); //Calculates relative speedup
}
ライブラリで多数の実行を実行し、それらを平均してタイミングの変動を計算することもできれば素晴らしいことです!
基本的に、必要なのは高解像度のタイマーだけです。経過時間はもちろん時間の差であり、スピードアップは各タスクの時間を分割することで計算されます。少なくともWindowsとUNIXで動作する高解像度タイマーのコードを含めました。
#ifdef WIN32
#include <windows.h>
double get_time()
{
LARGE_INTEGER t, f;
QueryPerformanceCounter(&t);
QueryPerformanceFrequency(&f);
return (double)t.QuadPart/(double)f.QuadPart;
}
#else
#include <sys/time.h>
#include <sys/resource.h>
double get_time()
{
struct timeval t;
struct timezone tzp;
gettimeofday(&t, &tzp);
return t.tv_sec + t.tv_usec*1e-6;
}
#endif
_time.h
_で定義されている関数clock()
を使用します。
_startTime = (float)clock()/CLOCKS_PER_SEC;
/* Do work */
endTime = (float)clock()/CLOCKS_PER_SEC;
timeElapsed = endTime - startTime;
_
POSIXでは、 getrusage を試してください。関連する引数はRUSAGE_SELFで、関連するフィールドはru_utime.tv_secとru_utime.tv_usecです。
これを支援する既存のユーティリティがあるかもしれませんが、私はほとんどが何らかのサンプリングまたはおそらく注入を使用すると思われます。ただし、コードの特定のセクションのタイミングを取得するには、例で示したように、おそらくタイマーへの呼び出しを追加する必要があります。 Windowsを使用している場合、高性能タイマーが機能します。 I 同様の質問に答えた と、それを行うサンプルコードを示しました。 Linuxにも同様の方法があります。