我需要测量一个操作的平均执行时间,为此我在循环中运行这样的操作:
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。