代码

时间:2016-09-12 13:23:19

标签: linux c++11 timing

我正在对一些C ++代码的计时进行简单的测试,我遇到了一个我不是100%肯定的工件。

设置

我的代码使用C ++ 11 high_resolution_clock来衡量已用时间。我还使用Linux的time命令(/usr/bin/time)来包装程序的执行。对于我的程序,high_resolution_clock报告~2s而time报告~7s(~6.5s用户和~.5s系统)。同时使用详细选项表明我的程序使用100%的CPU,1个自愿上下文切换和10个非自愿上下文切换(/usr/bin/time -v)。

问题

我的问题是在OS时间测量和性能时间测量之间产生如此显着差异的原因是什么?

我的初步想法

通过我对操作系统的了解,我假设这些差异完全是由与其他程序的上下文切换引起的(如time -v所述)。

这是造成这种差异的唯一原因吗?在查看代码性能时,我应该相信我的程序或系统报告的时间吗?

同样,我的假设是在Linux的时间内相信我的程序计算的时间,因为它不仅仅是我的程序的CPU使用时间。

注意事项

  • 我不会发布代码,因为它与手头的问题并不紧密相关。如果你想知道它是一个简单的测试,它可以进行100,000,000次随机浮点算术运算。

  • 我知道我的C ++代码中的其他时钟可能或多或少适合不同的情况(this stack overflow question)。 High_resolution_clock只是一个例子。

编辑:按要求编写的代码

#include <chrono>
#include <cstdlib>
#include <iostream>
#include <vector>

using namespace std;
using namespace std::chrono;

int main() {
  size_t n = 100000000;

  double d = 1;

  auto start_hrc = high_resolution_clock::now();

  for(size_t i = 0; i < n; ++i) {
    switch(rand() % 4) {
      case 0: d += 0.0001; break;
      case 1: d -= 0.0001; break;
      case 2: d *= 0.0001; break;
      case 3: d /= 0.0001; break;
    }
  }

  auto end_hrc = high_resolution_clock::now();
  duration<double> diff_hrc = end_hrc - start_hrc;
  cout << d << endl << endl;
  cout << "Time-HRC: " << diff_hrc.count() << " s" << endl;
}

1 个答案:

答案 0 :(得分:0)

  

我的问题是在OS时间测量和性能时间测量之间产生如此显着差异的原因是什么?

您的系统似乎需要一段时间才能启动您的应用程序。可能是资源问题:没有足够的可用内存(交换)或超额订购的CPU。

在我的桌面上没有观察到显着的差异:

Time-HRC: 1.39005 s
real    0m1.391s
user    0m1.387s
sys     0m0.004s