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

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

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

怎么做?

【问题讨论】:

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

标签: c windows winapi time


【解决方案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 库,特别是timedifftime 函数:

/* 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 的 QueryPerformanceCounterQueryPerformanceFrequency 函数。在块之前和之后调用前者并减去(当前 - 旧)以获得实例之间的“滴答”数。将其除以后一个函数获得的值,得到持续时间(以秒为单位)。

    【讨论】:

      【解决方案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。这是一个有用的属性,可用于基准测试和实施考虑运行时间的延迟。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-08
            • 2011-04-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多