绝对不要使用gettimeofday()来测量时间
前段时间写了一篇在Linux下C++开发中想要测量一段逻辑处理所花费的时间的文章,当时我是使用的gettimeofday()方法,但文章发布之后,发现谷歌广告相关链接却是gettimeofday() should never be used to measure time的广告,并且在其他网站上也见到了这个广告链接。这种技术性很强的广告链接的确很少见的。
点开广告内容,便是https://blog.habets.se/2010/09/gettimeofday-should-never-be-used-to-measure-time
先不去讨论这个广告的意图,暂且从上述链接文章把大体摘要一些信息,再仔细考虑下是否合理。
声明下,从英语原文中省略了很多东西,没有全翻译,只是把主要段落贴出来。
gettimeofday() 和 time()应当只被用来得到当前你想要的时钟时间,绝不能用来测量时间或者安排某个事件在将来某个时间去做。
出了什么问题?
gettimeofday()返回的是当前时钟时间和时区。time()返回的是包含时间秒,但不包含时区的一个子集信息。
调用这两个函数来测量一段逻辑处理所占用的时间好像是很容易被人接受的。毕竟,在现实生活中,我们也是通过记录手表的开始时间和结束时间来计算花费时间的。
应该用什么替代gettimeofday()
最简单的来准备测量时间应该用clock_gettime(CLOCK_MONOTONIC, ...)方法。
如果重启,它将不稳定,不过我们也不在意这点。我们只是想用一个计时器来测量一段逻辑处理花费的时间。
timespec start, end, diff; clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start); /// your logic here clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end); diff.tv_sec = ( end.tv_sec - start.tv_sec ); diff.tv_nsec = ( end.tv_nsec - start.tv_nsec ); if (diff.tv_nsec < 0) { diff.tv_sec--; diff.tv_nsec += 1000000000; } int usec = diff.tv_nsec + diff.tv_sec * 100000000; double resultTime = (double)usec / 1000000; printf("TimeMeasure: used time %6.1lf[ms]\n", resultTime);
到此,摘要地基本差不多了。
概要地说,就是要用clock_gettime(,)来代替gettimeofday()