高精度计时器(C++)

博主在研究图像处理和模式识别时,因需知道图像处理时间且精度要求达微秒级,使用QueryPerformanceFrequency()和QueryPerformanceCounter()函数,将其做成一个类,并给出了TimerCounter.h和TimerCounter.cpp代码,测试输出耗时为109.243ms。

用于获取程序性能的高精度计时器(C++)
目前在研究图像处理和模式识别,在图像处理过程中需要知道处理的时间,时间精度要求微秒级,所以用到QueryPerformanceFrequency()和QueryPerformanceCounter()这两个函数,据称该精度可达到微秒级。我把它单独做成了一个类,代码如下:

TimerCounter.h

#include <windows.h>
class TimerCounter
   {
 public:
      TimerCounter(void);//构造函数
      ~TimerCounter(void);//析构函数
 private:
      LARGE_INTEGER startCount;//记录开始时间
 
    LARGE_INTEGER endCount;//记录结束时间

    LARGE_INTEGER freq;//本机CPU时钟频率
 public:
    double dbTime;//程序运行的时间保存在这里
 
 public:
    void Start();//被测程序开始点处开始计时
    void Stop();//被测程序结束点处结束计时
 };

TimerCounter.cpp

#include "StdAfx.h"
#include "TimerCounter.h" 
#include <iostream> 
using namespace std; 
TimerCounter::TimerCounter(void) 
 { 
     QueryPerformanceFrequency(&freq);//获取主机CPU时钟频率
}
TimerCounter::~TimerCounter(void)
{
}
void TimerCounter::Start()
{
     QueryPerformanceCounter(&startCount);//开始计时
}
 void TimerCounter::Stop()
{
     QueryPerformanceCounter(&endCount);//停止计时
 
     dbTime=((double)endCount.QuadPart-(double)startCount.QuadPart)/(double)freq.QuadPart;//获取时间差
 
}

测试

void main()
{
    TimerCounter tc;
    tc.Start();
    Sleep(100);
    tc.Stop();
    cout<<"耗时: "<<tc.dbTime * 1000<<"ms"<<endl;
}

输出:
耗时:109.243ms

C++ 中实现高精度计时器通常需要依赖操作系统提供的 API 或硬件定时器。以下是几种常见的高精度计时方法及其代码示例: --- ### **1. 使用 `<chrono>` 库(C++11 及以上)** **特点**: - 跨平台,但精度受限于系统(Windows 通常为毫秒级,Linux/macOS 可能达到微秒级)。 - 适合一般高精度场景(如性能测试、延迟测量)。 #### **示例代码** ```cpp #include <iostream> #include <chrono> #include <thread> int main() { // 获取开始时间点 auto start = std::chrono::high_resolution_clock::now(); // 模拟耗时操作 std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 获取结束时间点 auto end = std::chrono::high_resolution_clock::now(); // 计算持续时间(纳秒级) auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start); std::cout << "耗时: " << duration.count() << " 纳秒" << std::endl; return 0; } ``` **输出示例**: ``` 耗时: 100123456 纳秒 ``` --- ### **2. 使用平台特定 API** #### **Windows: `QueryPerformanceCounter`** **精度**:通常为微秒级。 ```cpp #include <iostream> #include <windows.h> int main() { LARGE_INTEGER freq, start, end; QueryPerformanceFrequency(&freq); // 获取计时器频率 QueryPerformanceCounter(&start); // 开始计时 // 模拟耗时操作 Sleep(100); QueryPerformanceCounter(&end); // 结束计时 double elapsed = (end.QuadPart - start.QuadPart) * 1000.0 / freq.QuadPart; // 毫秒 std::cout << "耗时: " << elapsed << " 毫秒" << std::endl; return 0; } ``` #### **Linux: `clock_gettime`** **精度**:纳秒级(需链接 `-lrt` 库)。 ```cpp #include <iostream> #include <time.h> int main() { timespec start, end; clock_gettime(CLOCK_MONOTONIC, &start); // 开始计时 // 模拟耗时操作 nanosleep(&(struct timespec){0, 100000000}, NULL); // 100ms clock_gettime(CLOCK_MONOTONIC, &end); // 结束计时 double elapsed = (end.tv_sec - start.tv_sec) * 1e3 + (end.tv_nsec - start.tv_nsec) / 1e6; // 毫秒 std::cout << "耗时: " << elapsed << " 毫秒" << std::endl; return 0; } ``` --- ### **3. 硬件定时器(嵌入式场景)** 在嵌入式系统中(如 STM32),可直接使用硬件定时器(TIM)实现高精度计时: ```cpp // 示例:STM32 HAL 库(基于 SysTick 或 TIM) #include "stm32f4xx_hal.h" uint32_t start, end; int main() { HAL_Init(); start = HAL_GetTick(); // 毫秒级(SysTick) // 模拟耗时操作 HAL_Delay(100); end = HAL_GetTick(); printf("耗时: %lu 毫秒\n", end - start); // 或使用更高精度的定时器(如微秒级) __HAL_TIM_SET_COUNTER(&htim2, 0); // 重置定时器计数器 // ...执行操作... uint32_t us = __HAL_TIM_GET_COUNTER(&htim2); // 获取微秒数 return 0; } ``` --- ### **4. 高精度循环计时(忙等待)** **适用场景**:需要极短延迟(如微秒级),但会占用 CPU。 ```cpp #include <iostream> #include <chrono> #include <thread> void delay_us(uint64_t microseconds) { auto start = std::chrono::high_resolution_clock::now(); while (true) { auto now = std::chrono::high_resolution_clock::now(); auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(now - start).count(); if (elapsed >= microseconds) break; } } int main() { auto start = std::chrono::high_resolution_clock::now(); delay_us(100); // 延迟 100 微秒 auto end = std::chrono::high_resolution_clock::now(); std::cout << "实际耗时: " << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " 微秒" << std::endl; return 0; } ``` --- ### **关键注意事项** 1. **精度与开销**: - `<chrono>` 跨平台但精度可能不足。 - 平台特定 API(如 `clock_gettime`)通常更高精度。 - 忙等待(如 `delay_us`)会占用 CPU,仅适用于短时间延迟。 2. **时钟类型选择**: - `CLOCK_MONOTONIC`(Linux):不受系统时间调整影响。 - `high_resolution_clock`(C++):可能是 `steady_clock` 的别名。 3. **多线程安全**: - 高精度计时器通常不是线程安全的,需自行同步(如加锁)。 4. **嵌入式系统**: - 直接使用硬件定时器(如 STM32 的 TIM)可实现纳秒级精度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值