如何在 C 中测量时间?

Posted

技术标签:

【中文标题】如何在 C 中测量时间?【英文标题】:How do I measure time in C? 【发布时间】:2011-04-03 04:50:35 【问题描述】:

我想知道某个代码块执行了多长时间(大约)。像这样的:

startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);

怎么做?

【问题讨论】:

@Pmod 平台是什么意思?我的操作系统是 Windows。 您希望达到什么分辨率,您愿意承受多少累积开销? @Noah,我可以容忍一毫秒的误差 一毫秒是很长的时间。大多数任何软件时钟都足够好。 【参考方案1】:

可以在time.h中使用clock方法

例子:

clock_t start = clock();
/*Do something*/
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;

【讨论】:

+1:很好很简单。但是,如果您想获得几分之一秒,您是否不需要在除法之前将(end - start) 转换为浮点数? 请注意,clock() 测量的是 CPU 时间,而不是挂钟时间(这可能是也可能不是您想要的)。 @caf 虽然在 Linux 上为 true,但 clock() 实际上在 Windows 上计算挂钟时间:msdn.microsoft.com/en-us/library/4e2ess30.aspx @undefined:不仅仅是 Linux,实际上是 C 标准说 clock 函数决定了所使用的处理器时间。”。我想在 Windows 上,您可以简单地说实现对所用处理器时间的最佳近似是所用的挂钟时间。 注意:对于任何困惑的人,CLOCKS_PER_SEC 不是您的 cpu 的时钟频率。【参考方案2】:

您可以使用time.h 库,特别是time 和difftime 函数:

/* difftime example */
#include <stdio.h>
#include <time.h>

int main ()

  time_t start,end;
  double dif;

  time (&start);
  // Do some calculation.
  time (&end);
  dif = difftime (end,start);
  printf ("Your calculations took %.2lf seconds to run.\n", dif );

  return 0;

(示例改编自上面链接的 difftime 网页。)

请注意,此方法只能提供秒数的准确性 - time_t 记录自 UNIX epoch(1970 年 1 月 1 日)以来的秒数。

【讨论】:

这仅提供秒精度。而且您的示例实际上没有使用&lt;ctime.h&gt; 抱歉,'c' 是一个错字 - ctime 库在 time.h 中定义。是的,它只提供几秒钟的准确性。考虑到海报说“大约”,我认为这已经足够了。如果您愿意,我将编辑我的答案以包括它只会提供秒级准确性的事实。【参考方案3】:

如果您不需要出色的分辨率,可以使用 GetTickCount():http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx (如果不是用于您自己的简单诊断,请注意这个数字可以环绕,所以您需要通过一些算术来处理)。

QueryPerformanceCounter 是另一个合理的选择。 (MSDN上也有描述)

【讨论】:

【参考方案4】:

我会使用 Windows API 的 QueryPerformanceCounter 和 QueryPerformanceFrequency 函数。在块之前和之后调用前者并减去(当前 - 旧)以获得实例之间的“滴答”数。将其除以后一个函数获得的值,得到持续时间(以秒为单位)。

【讨论】:

【参考方案5】:

GetTickCount()。

#include <windows.h>
void MeasureIt()

    DWORD dwStartTime = GetTickCount();
    DWORD dwElapsed;

    DoSomethingThatYouWantToTime();

    dwElapsed = GetTickCount() - dwStartTime;

    printf("It took %d.%3d seconds to complete\n", dwElapsed/1000, dwElapsed - dwElapsed/1000);

【讨论】:

【参考方案6】:

有时需要测量天文时间而不是CPU时间(尤其适用于Linux):

#include <time.h>

double what_time_is_it()

    struct timespec now;
    clock_gettime(CLOCK_REALTIME, &now);
    return now.tv_sec + now.tv_nsec*1e-9;


int main() 
    double time = what_time_is_it();
    printf("time taken %.6lf\n", what_time_is_it() - time);
    return 0;

【讨论】:

【参考方案7】:

标准 C 库提供了time 函数,如果您只需要比较秒数,它就很有用。但是,如果您需要毫秒精度,最便携的方法是调用timespec_get。如果系统支持,它可以将时间精确到纳秒。然而,调用它需要更多的努力,因为它涉及一个结构。这是一个将结构体转换为简单的 64 位整数的函数。

#include <stdio.h>
#include <inttypes.h>
#include <time.h>

int64_t millis()

    struct timespec now;
    timespec_get(&now, TIME_UTC);
    return ((int64_t) now.tv_sec) * 1000 + ((int64_t) now.tv_nsec) / 1000000;


int main(void)

    printf("Unix timestamp with millisecond precision: %" PRId64 "\n", millis());

clock 不同,此函数返回一个 Unix 时间戳,因此它可以正确计算阻塞函数所花费的时间,例如 sleep。这是一个有用的属性,可用于基准测试和实施考虑运行时间的延迟。

【讨论】:

以上是关于如何在 C 中测量时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何测量 Linux 和 Windows 中函数的“用户”执行时间

如何在 Linux 多线程环境中测量函数的总执行时间

如何在 TensorFlow 中可靠地测量 sess.run() 的时间?

如何测量 C 中任意函数调用使用的堆栈数量?

如何在 Linux/Windows 上测量 CPU 时间和挂钟时间?

如何测量 C 中的函数堆栈使用情况?