C++计算耗时方法(四种方法)

本文详细介绍了C++中四种测量代码执行时间的方法:高精度时钟计时、CPU时钟计时、GetTickCount与high_resolution_clock,以及系统_clock实现的微秒级计时。通过实例展示了每种方法的使用和精度特点,并附带Python计算耗时的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本博客将给出四种在 C++ 中可用于 计算算法耗时 的方法。

方法(推荐方法4

1(返回的是CPU时钟计时单元,每秒为1000个时钟周期)(单位为s,可精确到小数点后三位)

#include <time.h>   // or  #include <ctime>
const clock_t begin_time = clock();    
float seconds = float(clock( ) - begin_time) / 1000;    //最小精度到ms

2 (单位为ms,仅精确到整数部分

#include <iostream>
#include <chrono>
using std::chrono::high_resolution_clock;
using std::chrono::milliseconds;

int main()
{
    high_resolution_clock::time_point beginTime = high_resolution_clock::now();
    ...
    high_resolution_clock::time_point endTime = high_resolution_clock::now();
    milliseconds timeInterval = std::chrono::duration_cast<milliseconds>(endTime - beginTime);
    std::cout << timeInterval.count() << "ms\n";
}

3 (单位为ms,仅精确到整数部分

#include <sys/timeb.h>
#include <Windows.h>     //解决DWORD报错

DWORD start1, end1;      
start1 = GetTickCount();
end1 = GetTickCount(); 

DWORD time = end1 - start1;
cout << "所耗时间为:" << time << "ms" << endl;

4 (单位可到微秒)

#include <chrono>   //计算时间
using namespace std::chrono;

auto starttime = system_clock::now();
...
auto diff = std::chrono::duration_cast<std::chrono::milliseconds>(system_clock::now()- starttime).count();
cout << "所耗时间为:" << diff << "ms" << endl;

在这里插入图片描述


彩蛋:
python计算程序耗时:(单位为s)

import time
starttime = time.time()   # 记录当前时间,返回当前时间的时间戳(1970纪元后经过的浮点秒数)
.......
endtime = time.time()
time = endtime - starttime
print(f"所耗时间为{time}s")

------tbc-------
有用可以点个大拇指哦 🤭

<think>好的,用户问的是如何在C++计算一个方法耗时。我需要先回忆一下C++中常用的时间测量方法。首先想到的是使用<chrono>头文件,因为这是C++11引入的高精度时间库,应该是最推荐的方式。然后是传统的clock()函数,属于C标准库,不过可能存在精度问题,尤其是在多线程环境下。可能还有其他的方法,比如Windows平台下的QueryPerformanceCounter,但考虑到跨平台,还是优先介绍标准库的方法。 接下来,我需要分步骤解释。首先介绍使用std::chrono的方法,这是现代C++的最佳实践。需要详细说明如何获取开始和结束的时间点,然后计算持续时间,转换为合适的单位,比如毫秒或微秒。然后给出一个完整的代码示例,确保语法正确,比如使用auto关键字声明变量,正确的命名空间等。 然后,可能需要提到传统的clock()函数,但要指出它的局限性,比如它测量的是CPU时间,而不是实际经过的时间,特别是在多线程或等待I/O的情况下,可能不准确。同样给出示例代码,并说明CLOCKS_PER_SEC的作用。 用户可能需要了解不同方法的优缺点,所以需要比较这两种方法,指出chrono的高精度和跨平台性,而clock()的适用场景有限。此外,提醒用户注意在测量时避免其他干扰因素,比如多次测量取平均值,或者确保测试环境稳定。 还要检查是否需要提到其他库或方法,比如Boost库中的计时工具,但考虑到用户可能希望使用标准库,所以可能不需要展开,除非用户有特别需求。不过用户的问题中没有提到,所以暂时不提。 最后,确保回答结构清晰,分点说明,代码示例正确,并且用中文口语化表达,避免使用专业术语过多,必要时进行解释。比如解释“高精度时间库”是什么意思,或者“持续时间”如何计算。同时,注意用户可能对C++的版本有要求,所以需要提到C++11及以上支持chrono。 总结步骤: 1. 介绍std::chrono方法,代码示例,解释每个步骤。 2. 介绍clock()函数,代码示例,说明其局限性。 3. 对比两种方法的优缺点,给出使用建议。 4. 提醒注意事项,如多次测量,避免干扰。 检查是否有遗漏,比如其他方法如使用time()函数,但精度太低(秒级),不适合方法耗时测量,所以不推荐。因此不需要提及。确保所有代码示例正确,比如chrono的正确用法,使用steady_clock还是high_resolution_clock,这里应该推荐steady_clock,因为它保证单调性,适合测量时间间隔。 可能还需要提到在C++17或更高版本中的一些改进,但基本用法不变。保持回答简洁,覆盖主要方法即可。最后检查是否符合用户的要求:结构清晰,步骤详细,代码正确,使用中文,格式正确,数学公式用$...$,但这里可能没有数学公式,所以主要关注代码块的格式,但用户的问题中不需要LaTeX公式,所以可能不需要处理。不过根据系统指令,如果有行内数学表达式需要用$...$,但当前问题不涉及数学公式,所以没问题。</think>在C++计算方法耗时,可以通过以下两种常用方式实现,逐步说明如下: --- ### 方法1:使用 `std::chrono`(C++11及以上,推荐) **步骤说明**: 1. **包含头文件**:`#include <chrono>` 2. **记录开始时间点**:使用 `std::chrono::steady_clock::now()` 3. **执行目标方法** 4. **记录结束时间点** 5. **计算时间差**:将时间差转换为毫秒、微秒等单位。 **示例代码**: ```cpp #include <iostream> #include <chrono> void targetMethod() { // 模拟耗时操作 for (int i = 0; i < 1000000; ++i); } int main() { // 记录开始时间 auto start = std::chrono::steady_clock::now(); // 执行目标方法 targetMethod(); // 记录结束时间 auto end = std::chrono::steady_clock::now(); // 计算耗时(转换为毫秒) auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); std::cout << "耗时:" << duration.count() << " 毫秒" << std::endl; return 0; } ``` **优点**: - 高精度(纳秒级)。 - 跨平台支持。 - 直接测量实际经过的时间(Wall-clock Time)。 --- ### 方法2:使用 `clock()` 函数(传统方式) **步骤说明**: 1. **包含头文件**:`#include <ctime>` 2. **记录开始时钟周期**:`clock_t start = clock();` 3. **执行目标方法** 4. **记录结束时钟周期** 5. **计算时间差**:转换为秒或毫秒(需除以 `CLOCKS_PER_SEC`)。 **示例代码**: ```cpp #include <iostream> #include <ctime> void targetMethod() { // 模拟耗时操作 for (int i = 0; i < 1000000; ++i); } int main() { // 记录开始时间 clock_t start = clock(); // 执行目标方法 targetMethod(); // 记录结束时间 clock_t end = clock(); // 计算耗时(转换为毫秒) double duration = (double)(end - start) / CLOCKS_PER_SEC * 1000; std::cout << "耗时:" << duration << " 毫秒" << std::endl; return 0; } ``` **缺点**: - 测量的是CPU时间(而非实际时间),若方法中有I/O等待或多线程任务,结果不准确。 - 精度通常较低(毫秒级)。 --- ### 对比与建议 | 方法 | 精度 | 测量类型 | 适用场景 | |-------------------|------------|----------------|------------------------| | `std::chrono` | 高(纳秒) | 实际经过时间 | 通用,推荐使用 | | `clock()` | 低(毫秒) | CPU时间 | 简单单线程任务 | **建议**: - 优先使用 `std::chrono`,尤其需要高精度或跨平台时。 - 若需兼容旧代码(C++11以下),可谨慎使用 `clock()`。 --- ### 注意事项 1. **多次测量取平均值**:单次结果可能有波动,建议多次执行取平均。 2. **优化干扰**:编译器优化可能影响耗时测量,可在发布模式下测试。 3. **区分CPU/实际时间**:I/O或阻塞操作需用实际时间(如 `std::chrono`)。 通过上述方法,可以准确测量C++方法的执行耗时
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

8倍

谢谢大佬~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值