7

我想测量循环内函数的速度。但是为什么我这样做的方式总是打印“0”而不是具有 9 位十进制精度(即以纳/微秒为单位)的高分辨率计时?

正确的方法是什么?

#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

请参阅我问过的关于同一件事的问题:显然clock()' 的分辨率不能保证这么高。

C++ 在 Linux 上获取毫秒时间——clock() 似乎不能正常工作

尝试gettimeofday功能,或提升

于 2009-03-31T07:46:52.963 回答
2

如果您需要平台独立性,您需要使用类似 ACE_High_Res_Timer ( http://www.dre.vanderbilt.edu/Doxygen/5.6.8/html/ace/a00244.html )

于 2009-04-06T03:17:04.460 回答
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 回答