我正在尝试计算函数运行所用的刻度数,并使用clock()
函数来计算,如下所示:
unsigned long time = clock();
myfunction();
unsigned long time2 = clock() - time;
printf("time elapsed : %lu",time2);
但问题是它返回的值是10000的倍数,我认为是CLOCK_PER_SECOND
,有没有更精确的方法或等效的函数值?
我正在使用Ubuntu 64位,但希望该解决方案能在Windows和Mac OS等其他系统上工作。
4条答案
按热度按时间uinbv5nw1#
POSIX中有许多更精确的计时器。
gettimeofday()
-正式过时,但广泛可用;微秒分辨率。clock_gettime()
-gettimeofday()
的替代品(但不一定广泛可用;在旧版Solaris上,需要-lposix4
才能链接),分辨率为纳秒。还有其他的亚秒计时器,其历史、便携性和分辨率都有所不同,包括:
ftime()
-毫秒分辨率(在POSIX 2004中标记为“传统”; POSIX 2008中没有)。clock()
-您已经知道了。请注意,它测量的是CPU时间,而不是已用(挂钟)时间。times()
-CLK_TCK
或HZ
。请注意,这会测量父行程序和子行程序的CPU时间。除非没有更好的方法,否则不要使用
ftime()
或times()
。time()
-一秒分辨率。clock()
函数以CLOCKS_PER_SEC
为单位进行报告,POSIX要求为1,000,000,但增量可能发生的频率较低(100次/秒是一个常见的频率)。返回值必须除以CLOCKS_PER_SEC
才能获得以秒为单位的时间。jexiocij2#
测量时间的最精确(但高度不可移植)的方法是计算CPU时钟周期。
例如,在x86上
如果你没有x86,你就必须重写汇编代码来适应你的CPU。如果你需要最大的精度,不幸的是这是唯一的方法...否则就使用clock_gettime()。
eoxn13cs3#
根据clock()联机帮助页,在POSIX平台上,CLOCKS_PER_SEC宏的值必须为1000000。正如您所说,从clock()获得的返回值是10000的倍数,这意味着分辨率为10毫秒。
还要注意,在Linux上,clock()返回程序使用的处理器时间的近似值。同样,在Linux上,调度程序统计信息在调度程序运行时以CONFIG_HZ频率更新。因此,如果周期性计时器的滴答声为100 Hz,您将获得分辨率为10 ms的进程CPU时间消耗统计信息。
壁时间测量不受此限制,并且可以更加精确。现代Linux系统上的clock_gettime(CLOCK_MONOTONIC,...)提供纳秒分辨率。
k3bvogb14#
我同意Jonathan的解决方案。下面是clock_gettime()的实现,精度为纳秒。
虽然很难达到ns精度,但这可以用来获得精度小于1微秒(700-900 ns).上面的printf只用于打印线程#(打印一条语句肯定需要2-3微秒).