C ++控制台输出影响chrono :: steady_clock时间测量

时间:2016-06-08 01:26:01

标签: c++ time g++ cout chrono

我需要测量一个操作的平均执行时间,为此我在循环中运行这样的操作:

double sum = 0;
int count = 100;
for(int i = 0; i < count; i++) {
  Timer t;

  t.startTimer();
  someOperation();
  t.endTimer();

  sum += t.getTimeInNanoseconds();
}

然后我按计数除以得到平均时间。 但是由于一些奇怪的原因,如果我要在t.startTimer()和t.endTimer()调用之外的循环内部向控制台输出内容,则执行时间会增加。

在虚拟机和普通计算机上运行代码时会出现问题。

造成这种情况的原因是什么?

以下是Timer类的外观:

class Timer {
  std::chrono::time_point<std::chrono::steady_clock> startTime, endTime;

  void startTimer() {
    startTime = std::chrono::steady_clock::now();
  }

  void endTimer() {
    endTime = std::chrono::steady_clock::now();
  }

  double getTimeInNanoseconds() {
    return (endTime - startTime).count();
  }
}

我之前尝试过使用high_resolution_clock但结果相似。

编辑 - MVCE:

#include <iostream>
#include <chrono>

using namespace std;

class Timer {
public:
  std::chrono::time_point<std::chrono::steady_clock> startTime, endTime;

  void startTimer() {
    startTime = std::chrono::steady_clock::now();
  }

    void endTimer() {
    endTime = std::chrono::steady_clock::now();
  }

    double getTimeInNanoseconds() {
    return (endTime - startTime).count();
  }
};

void foo() {
  int a;
  for(int n = 0 ; n < 10000000; n++) {
    a += 1;
  }
}

int main() {

  double sum1 = 0;
  int count = 100;
  for(int i =0; i < count; i++) {
    Timer t;

    t.startTimer();
    foo();
    t.endTimer();

    sum1 += t.getTimeInNanoseconds() / 1000000;
  }



  double sum2 = 0;
  for(int i =0; i < count; i++) {
    Timer t;

    t.startTimer();
    foo();
    t.endTimer();

    cout << "Foo" << endl;
    cout << "Bar" << endl;
    cout << "Foo" << endl;

    sum2 += t.getTimeInNanoseconds() / 1000000;
  }

  cout << "Average time 1: " << sum1 / (double) count << endl;
  cout << "Average time 2: " << sum2 / count << endl;

  return 0;
}

现在这里的时差并不高,但它仍然可见,因为sum2总是大于sum1。

0 个答案:

没有答案