根据时钟周期测量算法运行时间

时间:2014-11-16 17:35:05

标签: c++ performance algorithm

我正在使用以下代码片段来衡量我的算法运行时间的时钟滴答:

clock_t t;
t = clock();
//run algorithm
t = clock() - t;
printf ("It took me %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);

但是,当输入大小很小时,它返回0。这怎么可能呢?

2 个答案:

答案 0 :(得分:3)

时钟具有一定的粒度,取决于您的操作系统等几个因素。

因此,您的算法可能会快速运行,时钟没有时间更新。因此,测量的持续时间为0。

您可以尝试运行算法n次,并将测量时间除以n,以便更好地了解小输入所需的时间。

答案 1 :(得分:1)

标准C clock()函数的分辨率在系统之间可能会有很大差异,并且可能太小而无法测量算法。您有两个选择:

  1. 使用特定于操作系统的功能
  2. 重复几次算法,直到花费足够长的时间用clock()
  3. 进行测量

    对于1),如果程序在Windows下运行,则可以使用QueryPerformanceCounter()和QueryPerformanceFrequency();如果在Linux上运行,则使用clock_gettime()。

    有关详细信息,请参阅这些页面: QueryPerformanceCounter() clock_gettime()

    对于2)你必须按顺序执行你的算法一次,以便clock()报告的时间比clock()的最小粒度高几个数量级。假设clock()只能以12微秒的步长工作,那么总测试运行所消耗的时间应至少为1.2毫秒,因此您的时间测量偏差最多为1%。否则,如果你测量12微秒的时间你永远不知道它是否运行12.0微秒或23.9微米,但下一个更大的时钟()滴答是没有发生。您的算法在时间测量中按顺序执行的次数越多,您的时间测量就越精确。还要确保将调用复制粘贴到算法中以进行顺序执行;如果您只是在for循环中使用循环计数器,这可能会严重影响您的测量!