用于测量微秒的QueryPerformanceCounter的奇怪行为
Weird behavior of QueryPerformanceCounter for measuring microseconds
我需要测量我的书面函数的性能。由于我不能使用C++11并且需要微秒,所以我使用了Windows.h的QueryPerformanceCounter。
#include <Windows.h>
LARGE_INTEGER begin, end, frequency;
double timeElapsed = 0.0;
QueryPerformanceFrequency(&frequency);
for (int i = 0; i < 100; i++) {
QueryPerformanceCounter(&begin);
myFunctionToTest();
QueryPerformanceCounter(&end);
// get microsecs
timeElapsed = ((end.QuadPart - begin.QuadPart) * 1000.0 / frequency.QuadPart) * 1000;
std::cout << timeElapsed << std::endl;
appendToCsvFile(timeElapsed);
}
如果我不调用 appendToCsvFile((,则 timeElapsed 的结果通常在 2 到 10 微秒之间。
调用函数appendToCsvFile((,它只对将结果写入文件不执行任何操作,极大地影响测量结果(结果在20到60微秒之间(。
该函数在测量后称为U,但它有一些影响。有什么理由可以做到这一点吗?是否有适用于微秒测量的 Visual C++ 2010 库?
当测量微秒范围内的事物时,您需要预料到奇怪的事情会发生。
造成这种情况的原因有很多,包括:
- CPU缓存被清除
appendToCsvFile
,如果没有这个调用,myFunctionToTest
一遍又一遍地使用相同的内存,从而产生一个漂亮的热缓存和更好的性能。 - 当您编写文件时,您会触发一系列操作,最终导致数据最终出现在存储介质上。当控制权返回到程序时,并非所有这些操作都将完成,从而导致额外的后台 CPU 使用率,从而减慢
myFunctionToTest
相关文章:
- 没有找到相关文章