1. Windows高精度计时基础:认识QueryPerformanceCounter
在Windows平台上做性能优化,计时精度直接决定了你能发现多少隐藏的性能问题。我最早接触高精度计时是在开发游戏引擎时,当时用GetTickCount()发现连帧时间都测不准,后来才知道Windows提供了更强大的工具——QueryPerformanceCounter(简称QPC)和QueryPerformanceFrequency这对黄金组合。
QPC的工作原理其实很像体育比赛用的电子计时器。QueryPerformanceFrequency获取的是计时器的"心跳频率"(通常以赫兹为单位),而QueryPerformanceCounter则是读取当前"心跳次数"。比如频率是1000万赫兹(10MHz),两次读取的计数值差5000万,那么经过的时间就是5秒。这个API的精度可以达到微秒级,实测在我的i9-13900K机器上,计时分辨率能达到100纳秒级别。
cpp复制#include <windows.h>
#include <iostream>
void BasicQPCDemo() {
LARGE_INTEGER freq, start, end;
QueryPerformanceFrequency(&freq); // 获取计时器频率
QueryPerformanceCounter(&start); // 开始计时
// 模拟耗时操作
volatile int sum = 0;
for (int i = 0; i < 1000000; ++i) {
sum += i;
}
QueryPerformanceCounter(&end); // 结束计时
double elapsed = (end.QuadPart - start.QuadPart) * 1000.0 / freq.QuadPart;
std::cout << "耗时: " << elapsed << "毫秒" << std::endl;
}
这里有个实际开发中的坑要注意:QPC虽然精度高,但在多核CPU上可能会遇到"计时回退"问题。因为不同核心的TSC(时间戳计数器)初始值可能不同,当线程被调度到不同核心时,可能出现后来的计数值比前一个还小的情况。解决方法是在进程启动时调用SetThreadAffinityMask绑定到固定核心,或者使用Windows 10+系统,它们已经优化了QPC在多核下的行为。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 现代C++计时方案:std::chrono深度解析
C++11引入的<chrono>库让时间操作变得优雅很多。我特别喜欢它的设计哲学——用类型系统来防止时间单位混淆。比如你永远不会不小心把毫秒当成秒来用,因为编译器会在类型检查时就拦住你。
std::chrono提供三种时钟:
- `system_cloc
