0

使用“旧”版本时,在 C++ 中测量运行时间(挂墙时间)的推荐方法是什么?g++ 是 4.6.3(不是旧的,但不是 c++0x11,没有 -std=c++0x 开关),boost 也是旧的 1.46.1。

我尝试过测量 CPU 周期的 clock() 。我试过 boost::timer() 也可以测量 CPU 周期。我必须使用 C 函数吗?

如果重要的话,这是带有 3.5 内核的 Ubuntu Linux。假设我无法添加 c++0x 开关或升级编译器或 boost 库,我想找出最佳实践。

作为参考,我使用下面的代码来测试不同的功能。结果大约是 0.2 秒,而不是我在 cin 调用时等待的多秒。

{
  boost::timer t;

  for (int i = 0; i < 99999999; i ++) ;

  std::string sin;
  std::cin >> sin;

  std::cout << t.elapsed() << std::endl;
}
4

2 回答 2

0

boost::timer 是由clock() 实现的。对于 linux, time.h 中包含的 clock() 的返回值是您的程序占用的cpu 时间,而不是您的程序经过的时间,除以CLOCKS_PER_SEC。它指的是man 3 clock。根据您的代码,std::cin >> sin;不占用CPU时间。

升压计时器类:

class timer
{
 public:
  timer() { _start_time = std::clock(); } // postcondition: elapsed()==0
   ...
  double elapsed() const                  // return elapsed time in seconds
    { return  double(std::clock() - _start_time) / CLOCKS_PER_SEC; }

 private:
  std::clock_t _start_time;
}; 
于 2013-08-22T02:15:22.420 回答
0

使用 C/POSIX:

clock_gettime(CLOCK_MONOTONIC, ...);

将它包装到 C++ 函数中很方便,因此您不必处理timespecstruct 成员;最好将所有内容加入到long longordouble中。

例子:

double getTimeInSeconds()
{
    struct timespec result;
    if (clock_gettime(CLOCK_MONOTONIC, &result))
        throw ...something...;
    return result.tv_sec + (result.tv_nsec / 1000000000.);
}

您可能必须链接到 librt(即添加-lrt到链接器选项)和 pthreads。

于 2013-08-14T04:11:54.780 回答