7

ループ内の関数の速度を測定したい。しかし、なぜ私のやり方では、9桁の10進精度(つまり、ナノ/マイクロ秒)の高解像度タイミングではなく、常に「0」を出力するのですか?

それを行う正しい方法は何ですか?

#include <iomanip>
#include <iostream>
#include <time.h>
int main() {


 for (int i = 0; i <100; i++) {
    std::clock_t startTime = std::clock(); 
    // a very fast function in the middle
    cout << "Time: " << setprecision(9) << (clock() - startTime + 0.00)/CLOCKS_PER_SEC << endl;
 }

 return 0;
}

関連する質問:

4

6 に答える 6

6

時間計算関数をfor () { .. }ステートメントの外に移動し、合計実行時間をテスト ループ内の操作数で割ります。

#include <iostream>
#include <ctime>
#define NUMBER 10000 // the number of operations

// get the difference between start and end time and devide by
// the number of operations
double diffclock(clock_t clock1, clock_t clock2)
{
    double diffticks = clock1 - clock2;
    double diffms = (diffticks) / (CLOCKS_PER_SEC / NUMBER);
    return diffms;
}

int main() {
    // start a timer here
    clock_t begin = clock();

    // execute your functions several times (at least 10'000)
    for (int i = 0; i < NUMBER; i++) {
        // a very fast function in the middle
        func()
    }

    // stop timer here
    clock_t end = clock();

    // display results here
    cout << "Execution time: " << diffclock(end, begin) << " ms." << endl;
    return 0;
}

注: std::clock() はプロファイリングに十分な精度がありません。参照

于 2009-03-31T07:25:01.580 に答える
3

いくつかの指針:

  1. 私はオプティマイザーに注意します。何もしないと思うと、すべてのコードがスローされる可能性があります。
  2. ループを 100000 回実行したい場合があります。
  3. 合計時間の計算を行う前に、現在の時間を変数に格納します。
  4. プログラムを数回実行します。
于 2009-03-31T07:42:46.500 に答える
3

より高い解像度が必要な場合は、プラットフォームに依存するしかありません。

Windows では、QueryPerformanceCounter/QueryPerformanceFrequency API を確認してください。

Linux では、clock_gettime()を検索します。

于 2009-03-31T07:46:06.913 に答える
2

プラットフォームの独立性が必要な場合は、ACE_High_Res_Timer ( http://www.dre.vanderbilt.edu/Doxygen/5.6.8/html/ace/a00244.html )のようなものを使用する必要があります。

于 2009-04-06T03:17:04.460 に答える
2

同じことについて私が尋ねた質問を参照してくださいclock()

C++ が Linux でミリ秒単位の時間を取得する -- clock() が正しく動作していないようです

機能を試すgettimeofday、またはブーストする

于 2009-03-31T07:46:52.963 に答える
1

openMp の使用を検討することをお勧めします。

#include <omp.h>

int main(int argc, char* argv[])
{       
    double start = omp_get_wtime();

    // code to be checked

    double end = omp_get_wtime();

    double result = end - start;

    return 0;
}
于 2009-03-31T07:44:17.430 に答える