绝对不要使用gettimeofday()来测量时间

2015年06月23日 其他资源 4条评论 阅读30081次

前段时间写了一篇在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()

分享本文至:

WRITTEN BY

avatar
看了本文是不是觉得很赞,那就赶紧点击下面按钮分享给身边的朋友吧!

4 条评论

  1. avatar jamiecirillo

    <a href="http://www.lagunawoodsre.com/nike-roshe-run-hyp-green-white-shoesi">nike roshe run hyp green white</a> <a href="http://www.highbacklink.com/nike-air-max-tailwind-8-womens-red-grey-shoesp">nike air max tailwind 8 womens red grey</a> <a href="http://www.vuurogen.com/kvinners-air-jordan-retro-3-gr%C3%B8nn-gull-obuvl">kvinners air jordan retro 3 gr酶nn gull</a> <a href="http://www.rsvppersonnel.com/herre-nike-flyknit-lunar-3-gr%C3%B8n-lilla-skoj">herre nike flyknit lunar 3 gr酶n lilla</a> <a href="http://www.shonema.com/ua-micro-g-torch-viola-rosso-scarpel">ua micro g torch viola rosso</a> <a href="http://www.enventsurvey.com/nike-lebron-11-blue-shoesj">nike lebron 11 blue</a>
    jamiecirillo http://www.jamiecirillo.com/

  2. avatar pythausa

    <a href="http://www.salerahstore.com/nike-air-max-2015-mennns-gr%C3%A5-color-scarpec">nike air max 2015 mennns gr氓 color</a> <a href="http://www.schokostueck.com/nike-juventus-fc-textured-solid-performance-polo-black-nflx">nike juventus fc textured solid performance polo black</a> <a href="http://www.sftfinance.com/nike-white-tyron-smith-rush-pride-name-number-nfl-77-dallas-cowboys-t-shirt-nflz">nike white tyron smith rush pride name number nfl 77 dallas cowboys t shirt</a> <a href="http://www.cherrytreetv.com/under-armour-micro-g-torch-2-wei%C3%9F-kurpesa">under armour micro g torch 2 wei脽</a> <a href="http://www.favarte.com/nike-free-run-5.0-neon-verde-key-butyg">nike free run 5.0 neon verde key</a> <a href="http://www.docelarsjc.com/game-nike-orange-womens-denzel-ward-alternate-jersey-nfl-21-cleveland-browns-nflw">game nike orange womens denzel ward alternate jersey nfl 21 cleveland browns</a>
    [url=http://www.pythausa.com/]pythausa[/url]

  3. avatar idahoxrocks

    <a href="http://www.salesmasterypro.net/under-armour-curry-one-rose-gris-schuhef">under armour curry one rose gris</a> <a href="http://www.sastafitness.net/maschio-nike-sb-stefan-janoski-max-tutti-arancia-scarpee">maschio nike sb stefan janoski max tutti arancia</a> <a href="http://www.sattonet.net/nike-zoom-pegasus-33-oransje-rosa-kurpesa">nike zoom pegasus 33 oransje rosa</a> <a href="http://www.savetheastrodome.net/nike-air-max-97-noir-marron-kurpesc">nike air max 97 noir marron</a> <a href="http://www.schildgen.net/nike-free-flyknit-5.0-rosa-gr%C3%BCn-obuva">nike free flyknit 5.0 rosa gr眉n</a> <a href="http://www.scogblog.net/air-max-90-hvid-herre-salg-schuhef">air max 90 hvid herre salg</a>
    idahoxrocks http://www.idahoxrocks.net/

  4. avatar 美女图片站

    专业内容,无从下口。
    周末了,过来看看,问个好。(。・`ω´・) 欢迎回访。(勿忘我)。

欢迎留言




用户登录

sitemap