50

関数のタイミングを測定するために C++ で time.h を使用しています。

clock_t t = clock();
someFunction();
printf("\nTime taken: %.4fs\n", (float)(clock() - t)/CLOCKS_PER_SEC);

ただし、私は常に 0.0000 の時間を取得しています。clock() と t を別々に印刷すると、同じ値になります。C++ で時間を正確に (おそらくナノ秒単位で) 測定する方法があるかどうかを知りたいです。私はVS2010を使用しています。

4

4 に答える 4

102

C++11 ではchrono APIが導入されました。これを使用してナノ秒を取得できます。

auto begin = std::chrono::high_resolution_clock::now();

// code to benchmark

auto end = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end-begin).count() << "ns" << std::endl;

より適切な値を得るには、関数を数回実行して平均を計算することをお勧めします。

auto begin = std::chrono::high_resolution_clock::now();
uint32_t iterations = 10000;
for(uint32_t i = 0; i < iterations; ++i)
{
    // code to benchmark
}
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end-begin).count();
std::cout << duration << "ns total, average : " << duration / iterations << "ns." << std::endl;

ただし、forループと割り当てbeginendvar も CPU 時間を使用することを忘れないでください。

于 2014-04-10T22:12:17.083 に答える
57

私は通常、QueryPerformanceCounter関数を使用します。

例:

LARGE_INTEGER frequency;        // ticks per second
LARGE_INTEGER t1, t2;           // ticks
double elapsedTime;

// get ticks per second
QueryPerformanceFrequency(&frequency);

// start timer
QueryPerformanceCounter(&t1);

// do something
...

// stop timer
QueryPerformanceCounter(&t2);

// compute and print the elapsed time in millisec
elapsedTime = (t2.QuadPart - t1.QuadPart) * 1000.0 / frequency.QuadPart;
于 2013-01-15T12:04:23.633 に答える
6

私が完全に同意する次のテキストは、C ++のソフトウェアの最適化から引用されています(C ++プログラマーにとっては良い読み物です)-

時間間隔が短い場合、時間測定には非常に高い分解能が必要になる場合があります。Windowsでは、ミリ秒の解像度でGetTickCountまたは 関数を使用できます 。QueryPerformanceCounterCPUのタイムスタンプカウンターを使用すると、CPUクロック周波数でカウントされるため、はるかに高い解像度を得ることができます。

「クロック周波数が動的に変化する可能性があり、割り込みやタスクの切り替えにより測定が不安定になる」という問題があります。

于 2013-01-15T12:47:37.837 に答える
2

CまたはC ++では、通常、次のようにします。それでも失敗する場合は、rtdsc 関数の使用を検討してください。

      struct timeval time;
      gettimeofday(&time, NULL); // Start Time

      long totalTime = (time.tv_sec * 1000) + (time.tv_usec / 1000);

          //........ call your functions here

        gettimeofday(&time, NULL);  //END-TIME

        totalTime = (((time.tv_sec * 1000) + (time.tv_usec / 1000)) - totalTime);
于 2013-01-15T12:05:55.153 に答える