web-dev-qa-db-ja.com

Cコードを簡単にベンチマークするにはどうすればよいですか?

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
}

ライブラリで多数の実行を実行し、それらを平均してタイミングの変動を計算することもできれば素晴らしいことです!

49
Mike

基本的に、必要なのは高解像度のタイマーだけです。経過時間はもちろん時間の差であり、スピードアップは各タスクの時間を分割することで計算されます。少なくとも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
38
Joe

_time.h_で定義されている関数clock()を使用します。

_startTime = (float)clock()/CLOCKS_PER_SEC;

/* Do work */

endTime = (float)clock()/CLOCKS_PER_SEC;

timeElapsed = endTime - startTime;
_
37
Gaurav

POSIXでは、 getrusage を試してください。関連する引数はRUSAGE_SELFで、関連するフィールドはru_utime.tv_secとru_utime.tv_usecです。

1
lhf

これを支援する既存のユーティリティがあるかもしれませんが、私はほとんどが何らかのサンプリングまたはおそらく注入を使用すると思われます。ただし、コードの特定のセクションのタイミングを取得するには、例で示したように、おそらくタイマーへの呼び出しを追加する必要があります。 Windowsを使用している場合、高性能タイマーが機能します。 I 同様の質問に答えた と、それを行うサンプルコードを示しました。 Linuxにも同様の方法があります。

0
Mark Wilkins