C++ 程序耗时统计

在编程过程中经常需要统计一个代码段的耗时,本文主要记录 C++ 常用的耗时统计方式。

系统存储时间常见的两种方式为:

  1. 存储从1970年到现在经过多少时间
  2. 使用结构体分别存储当前时间的年月日时分秒

主要记录 time_tstruct time_valchrono 统计时间的相关函数使用方法:

  • time_t

    • 说明:存储了从1970年到现在经过了多少,所以使用time_t的精度也就是级别

    • 类型: time_t 实际上就是long int 类型

    • 函数:

      double difftime(time_t time1, time_t time2)
      
    • 示例:

      #include <ctime>
      #include <iostream>
      void test_time_t(){
      	time_t start_time, end_time;
      	time(&start_time);
      	...
      	time(&end_time);
      	double cost_time = difftime(end_time, start_time);
      	std::cout << "run func cost " << cost_time << " seconds" << std::endl;
      }
      
  • struct timeval

    • 说明:存储了从1970年到现在经过了多少微妙,所以使用timeval的精度也就是微妙级别

    • 类型:

      struct timeval{
          long tv_sec; /*秒*/
          long tv_usec; /*微秒*/
      };
      
    • 函数:

      int gettimeofday(struct timeval *tv, struct timezone *tz);
      
    • 注意:gettimeofdaylinux 系统函数

    • 示例

      #include <sys/time.>
      #include <unistd.h>
      #include <iostream>
      void test_timeval(){
      	struct timeval start_time;
          struct timeval end_time;
      	gettimeofday(&start_time, NULL);
      	...
      	gettimeofday(&end_time,NULL);
      	float cost_time = (end_time.tv_sec - start_time.tv_sec)*1000
                          + (end_time.tv_usec - start_time.tv_usec)/1000;
      	std::cout << "run func cost " << cost_time << " ms" << std::endl;
      }
      
  • chrono

    • 说明:chronoc++ 11中的时间库,提供计时,时钟等功能

    • 示例

    	  #include <chrono>
    	  using namespace std;
    	  using std::chrono::high_resolution_clock;
    	  using std::chrono::milliseconds;
    	  
    	  int test_chrono(){
    	  	high_resolution_clock::time_point start_time = high_resolution_clock::now();
    	  		...
    	  	high_resolution_clock::time_point end_time = high_resolution_clock::now();
    	  	milliseconds time_interval = std::chrono::duration_cast<milliseconds>(end_time - start_time);
    	  	cout << "run func cost " << time_interval.count() << " ms" endl;
    	  }
    
<think>嗯,用户让我介绍高精度耗时统计C++中的实现。首先,我需要确定用户的具体需求。高精度耗时统计通常用于性能分析、算法优化或者需要精确测量代码执行时间的场景。用户可能是开发者,正在优化代码,或者在学习如何测量程序性能。 接下来,我应该考虑C++中常用的高精度计时方法。首先想到的是C++11引入的<chrono>库,它提供了高精度的时钟,比如steady_clock和high_resolution_clock。这些时钟适合用于时间测量,因为它们的稳定性较好,不受系统时间调整的影响。 然后,我需要解释如何具体使用这些时钟。比如,用steady_clock记录开始和结束时间点,然后计算两者之差。可能需要展示代码示例,这样用户更容易理解。例如,使用auto start = chrono::steady_clock::now()和auto end = ...,然后duration_cast转换成毫秒或微秒。 另外,用户可能对跨平台兼容性感兴趣。Windows和Linux可能有不同的高精度计时方法,比如QueryPerformanceCounter在Windows上,而clock_gettime在Linux。不过C++11的chrono库已经做了封装,可能不需要平台特定的代码,这样更便携。 还要注意时间单位的转换,比如毫秒、微秒甚至纳秒。需要提醒用户根据需求选择合适的单位,避免精度损失。同时,多次测量取平均或统计分布也是常见的做法,以提高测量的准确性,尤其是处理短时间任务时。 可能用户还会关心性能开销。虽然chrono库本身的调用开销很小,但在测量极短的代码段时,多次测量或使用循环来放大测量时间可能更准确。需要提到这一点,并给出示例,比如循环执行代码段多次,计算总时间后取平均。 此外,异常情况处理,比如线程调度、系统中断可能影响测量结果,需要建议用户在相对安静的环境中进行测试,或者多次测量排除干扰。 总结下来,我应该分步骤介绍使用chrono库的方法,提供代码示例,讨论平台兼容性、时间单位选择、多次测量的重要性,以及注意事项。这样用户能得到全面的指导,满足他们的实际需求。</think>在 C++ 中实现高精度耗时统计通常需要借助操作系统或硬件提供的高精度计时器。以下是几种常见方法及其应用场景的详细介绍: --- ### **1. C++11 `<chrono>` 库(推荐)** C++11 标准库提供了跨平台的高精度计时工具,无需第三方依赖。 #### 实现示例: ```cpp #include <iostream> #include <chrono> using namespace std::chrono; int main() { // 记录开始时间点 auto start = steady_clock::now(); // 待测试的代码 for (int i = 0; i < 1000000; ++i) {} // 记录结束时间点 auto end = steady_clock::now(); // 计算耗时(支持纳秒、微秒、毫秒、秒等精度) auto duration_ns = duration_cast<nanoseconds>(end - start).count(); auto duration_us = duration_cast<microseconds>(end - start).count(); auto duration_ms = duration_cast<milliseconds>(end - start).count(); std::cout << "耗时: " << duration_ns << " 纳秒" << std::endl; return 0; } ``` #### 特点: - **精度**:通常为纳秒级(依赖硬件支持)。 - **跨平台**:支持 Windows/Linux/macOS。 - **稳定性**:`steady_clock` 不受系统时间调整影响,适合耗时统计。 --- ### **2. Windows 平台 API:`QueryPerformanceCounter`** 适用于需要极致性能的 Windows 专用代码。 #### 实现示例: ```cpp #include <windows.h> #include <iostream> int main() { LARGE_INTEGER freq, start, end; QueryPerformanceFrequency(&freq); // 获取计时器频率 QueryPerformanceCounter(&start); // 开始计时 // 待测试的代码 for (int i = 0; i < 1000000; ++i) {} QueryPerformanceCounter(&end); // 结束计时 // 计算耗时(秒) double duration = (end.QuadPart - start.QuadPart) / (double)freq.QuadPart; std::cout << "耗时: " << duration * 1e6 << " 微秒" << std::endl; return 0; } ``` #### 特点: - **精度**:硬件级高精度(通常为微秒级)。 - **仅限 Windows**:不跨平台。 --- ### **3. Linux 平台:`clock_gettime`** 适用于 Linux 系统的底层高精度计时。 #### 实现示例: ```cpp #include <time.h> #include <iostream> int main() { timespec start, end; clock_gettime(CLOCK_MONOTONIC, &start); // 开始计时 // 待测试的代码 for (int i = 0; i < 1000000; ++i) {} clock_gettime(CLOCK_MONOTONIC, &end); // 结束计时 // 计算耗时(纳秒) long duration_ns = (end.tv_sec - start.tv_sec) * 1e9 + (end.tv_nsec - start.tv_nsec); std::cout << "耗时: " << duration_ns << " 纳秒" << std::endl; return 0; } ``` #### 特点: - **精度**:纳秒级。 - **仅限 Linux**:需链接 `-lrt` 编译。 --- ### **注意事项** 1. **多次测量取平均**:单次测量可能受系统调度干扰,建议多次执行取平均值。 2. **避免优化干扰**:编译器可能优化掉空循环,可在代码中加入 `volatile` 变量防止优化。 3. **区分 CPU 时间与墙钟时间**: - **墙钟时间**(Wall Time):实际经过的时间(上述方法均为此类)。 - **CPU 时间**:代码实际占用的 CPU 时间,可通过 `clock()` 函数获取。 --- ### **应用场景** - 算法性能对比(如排序算法耗时)。 - 代码段瓶颈分析(定位耗时函数)。 - 实时系统或游戏开发中的帧率控制。 根据需求选择合适的方法,优先推荐 C++11 `<chrono>` 库实现跨平台高精度统计
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值