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

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

在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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。