C++在Windows下多种计时方式代码示例
在Windows系统下进行程序性能分析或调试时,准确的计时至关重要。本文将详细讲解C++中常用的五种计时机制:time()、clock()、timeGetTime()、GetTickCount()以及高精度的QueryPerformanceCounter()。通过完整的代码示例,帮助开发者理解各函数的精度差异与适用场景。
准备条件与头文件配置
要在Windows平台使用这些计时函数,需要在C++项目中包含相应的标准库或多媒体系统头文件。对于高精度计时器,还需链接对应的静态库。以下是必要的配置代码:
#include <stdio.h>
#include <windows.h>
#include <time.h> // 用于 time() 和 clock()
#include <Mmsystem.h> // 用于 timeGetTime()
#pragma comment(lib, "Winmm.lib") // 链接 multimedia 库以支持 timeGetTime
第1步:使用 time() 进行秒级计时
目的:获取粗略的时间差,适用于对精度要求不高(秒级)的场景。
操作说明:time()返回自Unix纪元以来的秒数。将待测代码前后的时间戳相减即可得到耗时。
int main() {
time_t timeBegin, timeEnd;
timeBegin = time(NULL);
Sleep(1000); // 模拟运行耗时1秒
timeEnd = time(NULL);
printf("%d\n", timeEnd - timeBegin); // 输出大致为 1
return 0;
}
第2步:使用 clock() 进行毫秒级进程时间计时
目的:测量CPU消耗的时间,而非墙上时钟时间。精度通常为毫秒级,取决于系统CLK_TCK设置。
操作说明:clock()返回程序启动后处理器所用的时钟打点数。需除以CLOCKS_PER_SEC转换为秒,或直接比较差值。
clock_t clockBegin, clockEnd;
clockBegin = clock();
Sleep(800); // 模拟运行
clockEnd = clock();
printf("%d\n", clockEnd - clockBegin); // 输出毫秒级数值
第3步:使用 timeGetTime() 进行多媒体毫秒计时
目的:提供比clock()更稳定的墙上时钟时间,常用于多媒体应用。
操作说明:返回从系统启动开始的毫秒数。注意,该值可能在长时间运行后溢出(约49.7天后)。使用前需确保已正确链接Winmm.lib。
DWORD dwBegin, dwEnd;
dwBegin = timeGetTime();
Sleep(800);
dwEnd = timeGetTime();
printf("%d\n", dwEnd - dwBegin); // 输出毫秒差值
第4步:使用 GetTickCount() 进行系统启动毫秒计时
目的:获取系统开机以来的毫秒数,简单易用。
操作说明:与timeGetTime()类似,返回DWORD类型的毫秒计数。同样存在溢出风险,但在现代64位系统中可通过GetTickCount64()避免。
DWORD dwGTCBegin, dwGTCEnd;
dwGTCBegin = GetTickCount();
Sleep(800);
dwGTCEnd = GetTickCount();
printf("%d\n", dwGTCEnd - dwGTCBegin);
第5步:使用 QueryPerformanceCounter() 进行微秒/纳秒级高精度计时
目的:获取最高精度的硬件计数器值,适用于需要微秒甚至纳秒级精度的性能剖析。
操作说明:通过QueryPerformanceFrequency()获取硬件频率,再结合QueryPerformanceCounter()获取计数器值。计算公式为:(计数值差 / 频率) * 1000(结果为毫秒)。
LARGE_INTEGER large_interger;
double dff;
__int64 c1, c2;
// 获取硬件频率
QueryPerformanceFrequency(&large_interger);
dff = large_interger.QuadPart;
// 开始计时
QueryPerformanceCounter(&large_interger);
c1 = large_interger.QuadPart;
Sleep(800);
// 结束计时
QueryPerformanceCounter(&large_interger);
c2 = large_interger.QuadPart;
printf("本机高精度计时器频率%lf\n", dff);
printf("计时%lf毫秒\n", (c2 - c1) * 1000 / dff);
完成判断与总结
在实际开发中,选择哪种计时方式取决于对精度的需求:日常调试可用time(),一般性能估算用clock()或GetTickCount(),而关键路径的性能剖析应使用QueryPerformanceCounter()。以上就是C++利用Windows API实现计时的详细内容,更多关于C++性能优化技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









