【问题标题】:C - gettimeofday for computing time?C - gettimeofday 计算时间?
【发布时间】:2011-03-19 14:04:49
【问题描述】:

你知道如何使用 gettimeofday 来测量计算时间吗?我可以通过这段代码测量一次:

  char buffer[30];
  struct timeval tv;

  time_t curtime;



 gettimeofday(&tv, NULL); 
 curtime=tv.tv_sec;

 strftime(buffer,30,"%m-%d-%Y  %T.",localtime(&curtime));
 printf("%s%ld\n",buffer,tv.tv_usec);

这个是在计算之前制作的,第二个是在计算之后制作的。但是你知道怎么减吗?

我需要以毫秒为单位的结果

【问题讨论】:

  • gettimeofday 实际上不应该用于测量经过的时间。请改用clock_gettime(CLOCK_MONOTONIC)Here's why
  • printf 语句中的“ld”是什么?以及为什么在某些程序中 ===> printf("time = %06lu\n", now.tv_usec);用来?引号中的 06 是什么?
  • 一个非常不错的网站,有一些很好的参考,有时还有一些例子,但也有其他的,比如维基书。 techonthenet.com/c_language/standard_library_functions/time_h/…
  • @Beginner...... %ld 是格式说明符:用于长十进制,%06lu 是格式说明符:用于带 6 个前导零的长无符号...您可以阅读 printf此处的格式说明符:cplusplus.com/reference/cstdio/printf

标签: c


【解决方案1】:

减去时间值:

gettimeofday(&t0, 0);
/* ... */
gettimeofday(&t1, 0);
long elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec;

这是假设您将使用小于 ~2000 秒的间隔,此时算术可能会溢出,具体取决于所使用的类型。如果您需要使用更长的间隔,只需将最后一行更改为:

long long elapsed = (t1.tv_sec-t0.tv_sec)*1000000LL + t1.tv_usec-t0.tv_usec;

【讨论】:

  • 不工作,我需要毫秒,它说分段错误
  • 分段错误与这段代码无关。它正在其他地方发生。
  • 我只在使用此代码时出现分段错误,但它不以毫秒为单位
  • 它以微秒为单位。如果需要毫秒,则除以 1000,但毫秒通常被认为是非常非常差的时间分辨率。如果您遇到分段错误,您需要显示您的代码或使用调试器自己查找它发生的位置,但由于我建议的任何代码,它绝对不会发生。
  • @Xofo:什么未初始化的内存?是的 gtod 已被弃用,但人们仍然出于适度合理的原因使用它。如果您愿意,请使用clock_gettime 并除以 1000。
【解决方案2】:

如果你想衡量代码效率,或者以任何其他方式衡量时间间隔,以下会更容易:

#include <time.h>

int main()
{
   clock_t start = clock();
   //... do work here
   clock_t end = clock();
   double time_elapsed_in_seconds = (end - start)/(double)CLOCKS_PER_SEC;
   return 0;
}

【讨论】:

  • 这会测量 CPU 时间,而不是实时,而且分辨率通常很差。
  • 如果您想测量 CPU 效率,这很好。如果您正在测量其他内容——比如 I/O 操作——使用 gettimeofday() 可能会更好。
  • 我只是想知道他是否正在尝试进行基准测试。那里没有C lib吗?但是你当然没事。我同意,因为我也在学习。只是请你们,不要离开标题。都在我们使用的库中吗?
【解决方案3】:

@Daniel Kamil Kozar 提供的答案是正确的答案 - gettimeofday 实际上不应该用于测量经过的时间。请改用clock_gettime(CLOCK_MONOTONIC)。


手册页说 - gettimeofday() 返回的时间受系统时间不连续跳转的影响(例如,如果系统管理员手动更改系统时间)。如果您需要一个单调递增的时钟,请参阅clock_gettime(2)。

Opengroup 说 - 应用程序应该使用 clock_gettime() 函数而不是过时的 gettimeofday() 函数。

似乎每个人都喜欢 gettimeofday,直到遇到它不起作用或不存在的情况(VxWorks)......clock_gettime 非常棒且可移植。

【讨论】:

    【解决方案4】:

    没有。 gettimeofday should NEVER be used to measure time.

    这导致了整个地方的错误。请不要添加更多错误。

    【讨论】:

    • @ijt 你是什么意思?我链接的内容已经列出了几个,包括断开连接、重新启动、错误数据和挂起。
    • “从不用于测量时间”具有极大的误导性,即使在该链接的第一行它说,“如果当前挂钟时间实际上是,则应仅用于获取当前时间你想要什么。”有时人们想实时了解他们的函数运行了多长时间。 “从不”是夸张的。
    • @EliezerMiron 不,如果你想知道函数运行多长时间,你从不想使用gettimeofday。如果您想知道 何时 运行,您 想使用 gettimeofday,这是一个完全不同的问题。您应该从不比较或减去 gettimeofday 的两个输出。
    • 如果 gettimeofday 可以为您提供函数运行时间的准确读数(按挂钟时间),那么为什么不能比较两次以查看挂钟时间函数开始运行了吗?
    • CLOCK_MONOTONICCLOCK_MONOTONIC_RAWCLOCK_BOOTTIME,具体取决于您是否需要“不包括暂停时间的秒数”。 “时间单位”或“秒,不包括暂停时间”。
    【解决方案5】:

    您的curtime 变量保存自纪元以来的秒数。如果你得到一个之前和一个之后,后面的减去前面的就是经过的时间,以秒为单位。您可以减去 time_t 值就好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-16
      • 2012-08-14
      • 1970-01-01
      • 2011-08-04
      • 2011-08-03
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多