如何在C ++中获取一段代码的执行时间?

时间:2014-07-03 18:31:23

标签: c++ linux benchmarking execution-time

我试图对一段代码进行基准测试。它基于此代码here,其中有趣的部分基本上如下所示:

    auto t0 = std::chrono::high_resolution_clock::now();
    ...
    auto t1 = std::chrono::high_resolution_clock::now();
    std::cout << secs(t1-t0).count() << " s\n";

问题是我在一台共享机器上,这给了我一些时间,所以我的结果并没有给我任何一致性。我真正需要的是某种秒表工具,它可以让我得到我的代码运行的时间,而不是墙上的时间。有什么选择?如果涉及系统特定的呼叫,我会在Linux机器上运行,但如果可能的话,我宁愿保持此代码的可移植性。

我已经查看了thisthis等其他问题,但他们似乎都提供了解决问题的时间。

4 个答案:

答案 0 :(得分:4)

如果在您的操作系统上可用,您可以使用times API获得与内置time命令类似的结果。

#include <sys/times.h>
...
struct tms  start, end;
times(&start);
//Do command
times(&end);
clock_t usr_time = end->tms_utime - start->tms_utime;
clock_t sys_time = end->tms_stime - start->tms_stime;

要100%完成,您应该检查时间的结果是否不等于-1,否则请检查errno代码。

答案 1 :(得分:1)

理想情况下,正如您提到的问题中提到的评论一样,您应该在main内隔离您要测量的代码段,并使用unix time命令行工具,该工具报告{{1 }和user时间。

如果您无法做到这一点,请考虑查看system的{​​{3}},并可能使用相同的技术对您的代码进行基准测试。

答案 2 :(得分:1)

我认为您需要将clock_gettime()与以下时钟CLOCK_PROCESS_CPUTIME_IDCLOCK_THREAD_CPUTIME_ID一起使用。它们给出了进程/线程消耗的CPU时间。

CLOCK_PROCESS_CPUTIME_ID
  High-resolution per-process timer from the CPU.
CLOCK_THREAD_CPUTIME_ID
  Thread-specific CPU-time clock.

参考:

我认为给出merlin2011的建议在许多情况下是不可行的,因为隔离可能需要付出很多努力,而用clock_gettime()添加两行代码是非常实用的。您甚至可以在类中包含对clock_gettime()的调用。

答案 3 :(得分:1)

对于Linux

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

  double  theseSecs = 0.0;
  double  startSecs = 0.0;
  double  secs;
  double  CPUsecs = 0.0;
  double  CPUutilisation = 0.0;
  double  answer = 0;
  clock_t starts;

  void start_CPU_time()
  {      
      starts = clock();;
      return;
  }

  void end_CPU_time()
  {
      CPUsecs = (double)(clock() - starts)/(double)CLOCKS_PER_SEC;
      return;
  }    

  struct timespec tp1;
  void getSecs()
  {
     clock_gettime(CLOCK_REALTIME, &tp1);
     theseSecs =  tp1.tv_sec + tp1.tv_nsec / 1e9;           
     return;
  }

  void start_time()
  {
      getSecs();
      startSecs = theseSecs;
      return;
  }

  void end_time()
  {
      getSecs();
      secs    = theseSecs - startSecs;
      return;
  }    

  void calculate()
  {
      int i, j;
      for (i=1; i<100001; i++)
      {
          for (j=1; j<10001; j++)
          {
              answer = answer + (float)i / 100000000.0;
          }
      }
  }

 void main()
 {
     start_time();
     start_CPU_time();
     calculate();
     end_time();
     end_CPU_time();
     CPUutilisation = CPUsecs /  secs * 100.0;
     printf("\n Answer %10.1f, Elapsed Time %7.4f, CPU Time %7.4f, CPU Ut %3.0f%\n",
              answer, secs, CPUsecs, CPUutilisation);  
 }