根据时钟滴答测量算法运行时间
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()
。以上是关于根据时钟滴答测量算法运行时间的主要内容,如果未能解决你的问题,请参考以下文章