测量在C++中调用system()的执行时间

jm1*_*890 4 c++ linux timing

我在这里找到了一些测量执行时间的代码 http://www.dreamincode.net/forums/index.php?showtopic=24685

但是,它似乎不适用于对system()的调用.我想这是因为执行跳出当前进程.

clock_t begin=clock();

system(something);

clock_t end=clock();
cout<<"Execution time: "<<diffclock(end,begin)<<" s."<<endl;
Run Code Online (Sandbox Code Playgroud)

然后

double diffclock(clock_t clock1,clock_t clock2)
{
    double diffticks=clock1-clock2;
    double diffms=(diffticks)/(CLOCKS_PER_SEC);
    return diffms;
}
Run Code Online (Sandbox Code Playgroud)

然而,这总是返回0秒...是否有另一种方法可以工作?

此外,这是在Linux中.

编辑:另外,只需添加,执行时间就是几小时.所以准确性并不是真正的问题.

谢谢!

Tuo*_*nen 9

你考虑过使用gettimeofday吗?

struct timeval tv;
struct timeval start_tv;

gettimeofday(&start_tv, NULL);

system(something);

double elapsed = 0.0;

gettimeofday(&tv, NULL);
elapsed = (tv.tv_sec - start_tv.tv_sec) +
  (tv.tv_usec - start_tv.tv_usec) / 1000000.0;
Run Code Online (Sandbox Code Playgroud)


Dip*_*ick 6

不幸的是,clock()在Linux上只有一秒的分辨率(即使它以微秒为单位返回时间).

许多人使用gettimeofday()进行基准测试,但是这会测量经过的时间 - 而不是此进程/线程使用的时间 - 因此并不理想.显然,如果您的系统或多或少处于闲置状态且测试时间很长,那么您可以对结果进行平均.通常较少的问题,但仍然值得知道的是gettimeofday()返回的时间是非单调的 - 它可以跳转一点,例如当你的系统首次连接到NTP时间服务器时.

用于基准测试的最佳方法是clock_gettime(),其中最适合您的任务的选项.

  • CLOCK_THREAD_CPUTIME_ID - 特定于线程的CPU时钟.
  • CLOCK_PROCESS_CPUTIME_ID - 来自CPU的高分辨率每进程计时器.
  • CLOCK_MONOTONIC - 表示自某些未指定的起点以来的单调时间.
  • CLOCK_REALTIME - 系统范围的实时时钟.

但请注意,并非所有Linux平台都支持所有选项 - 除了clock_gettime(CLOCK_REALTIME),它等同于gettimeofday().

有用的链接:使用clock_gettime进行性能分析代码