C++在Windows下多种计时方式代码示例

陆景行
陆景行
发布时间:2026-10-14 | 6人浏览过
原创

在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++性能优化技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表