gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:28:11 24 4
gpt4 key购买 nike

我需要衡量我编写的函数的性能。由于我不能使用 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 微秒之间)。

函数在测量后被调用,但它有一些效果。有什么理由可以做到这一点吗?是否有适用于微秒测量的 Visual C++ 2010 库?

最佳答案

在微秒范围内测量某些东西时,您需要预料到会发生奇怪的事情。

这有很多可能的原因,包括:

  1. CPU 缓存被 appendToCsvFile 清除,如果没有此调用,myFunctionToTest 会反复使用相同的内存,从而产生良好的热缓存和更好的性能。
  2. 当您写入文件时,您会触发一系列操作,这些操作最终会导致数据在您的存储介质上结束。当控制返回到您的程序时,并非所有这些操作都将完成,从而导致额外的后台 CPU 使用率,这将减慢 myFunctionToTest

关于c++ - QueryPerformanceCounter 用于测量微秒的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52871427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com