用于测量微秒的QueryPerformanceCounter的奇怪行为

Weird behavior of QueryPerformanceCounter for measuring microseconds

本文关键字:QueryPerformanceCounter 用于 测量      更新时间:2023-10-16

我需要测量我的书面函数的性能。由于我不能使用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 库?

当测量微秒范围内的事物时,您需要预料到奇怪的事情会发生。

造成这种情况的原因有很多,包括:

  1. CPU缓存被清除appendToCsvFile,如果没有这个调用,myFunctionToTest一遍又一遍地使用相同的内存,从而产生一个漂亮的热缓存和更好的性能。
  2. 当您编写文件时,您会触发一系列操作,最终导致数据最终出现在存储介质上。当控制权返回到程序时,并非所有这些操作都将完成,从而导致额外的后台 CPU 使用率,从而减慢myFunctionToTest
相关文章:
  • 没有找到相关文章