4

我在这里找到了一些关于测量执行时间的代码 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 中。

编辑:另外,只是要补充一点,执行时间以小时为单位。所以准确性并不是真正的问题。

谢谢!

4

3 回答 3

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;
于 2010-03-28T17:23:26.323 回答
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 分析代码

于 2010-03-28T18:11:32.057 回答
0

Tuomas Pelkonen 已经提出了gettimeofday一种方法,该方法允许以微秒级的分辨率获取时间。

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

我更喜欢保留整数(使用精确的数学),而不是尽可能地使用浮点数和它们的所有问题。

于 2010-03-28T17:33:16.283 回答