根据时钟滴答测量算法运行时间

Posted

技术标签:

【中文标题】根据时钟滴答测量算法运行时间【英文标题】:Measuring an algorithms running time in terms of clock ticks 【发布时间】:2014-11-16 17:35:04 【问题描述】:

我正在使用以下代码 sn-p 来衡量我的算法在时钟滴答声方面的运行时间:

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。这怎么可能?

【问题讨论】:

请标记您的编程语言 因为一般情况下,POSIX 将CLOCKS_PER_SEC 定义为 100 万,这意味着花费 clock()返回的值不一定每次都加1;粒度可能是每次更新10个tick左右,每10us更新一次+10。 您是否尝试提高printf 的精度并使用double 【参考方案1】:

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

因此,您的算法可能运行得如此之快,以至于时钟没有时间更新。因此测量的持续时间为 0。

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

【讨论】:

【参考方案2】:

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

    使用操作系统特定功能 多次重复您的算法,直到需要足够长的时间才能使用 clock() 进行测量

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

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

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

【讨论】:

对于 Mac OS X,你想要的是 mach_absolute_time()

以上是关于根据时钟滴答测量算法运行时间的主要内容,如果未能解决你的问题,请参考以下文章

TI DSP TMS320C66x学习笔记之算法运算时间测量

如何使时钟秒针以每秒 4 次跳动/滴答声移动?

如何在python中测量算法的运行时间[重复]

linux系统的最小时间间隔是多少

这个时钟滴答适用于 Intel i3 吗?

测量随机算法中的并行加速