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

时间:2010-03-28 17:21:22

标签: 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;

然后

double diffclock(clock_t clock1,clock_t clock2)
{
    double diffticks=clock1-clock2;
    double diffms=(diffticks)/(CLOCKS_PER_SEC);
    return diffms;
}

但是这总是会返回0秒......还有其他方法可以使用吗?

此外,这是在Linux中。

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

谢谢!

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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()。

有用的链接:Profiling Code Using clock_gettime

答案 2 :(得分:0)

Tuomas Pelkonen已经提出了gettimeofday方法,可以获得分辨率为微秒的时间。

在他的例子中,他继续转换为双倍。我个人已将timeval结构包装到我自己的类中,将计数保持为秒和微秒作为整数并正确处理加减操作。

我更喜欢保持整数(使用精确的数学运算),而不是在可以的时候得到浮点数和所有的问题。