c++计时

本文介绍如何在Linux环境下利用clock_gettime()函数实现精确到纳秒级别的程序计时,通过不同类型的计时器(如CLOCK_REALTIME、CLOCK_PROCESS_CPUTIME_ID和CLOCK_THREAD_CPUTIME_ID)进行计时,并提供了一个示例程序来展示如何获取并计算两个时间点之间的差值。
Linux下使用clock_gettime给程序计时

哦,clock_gettime( ) 提供了纳秒的精确度,给程序计时可是不错哦;

      
 
 

函数的原型如下:

         
int clock_gettime(clockid_t clk_id, struct timespect * tp);

clockid_t clk_id用于指定计时时钟的类型,对于我们Programmr以下三种比较常用:

CLOCK_REALTIME, a system-wide realtime clock.
CLOCK_PROCESS_CPUTIME_ID, high-resolution timer provided by the CPU for each process.
CLOCK_THREAD_CPUTIME_ID, high-resolution timer provided by the CPU for each of the threads.
CLOCK_REALTIME, a system-wide realtime clock.
CLOCK_PROCESS_CPUTIME_ID, high-resolution timer provided by the CPU for each process.
CLOCK_THREAD_CPUTIME_ID, high-resolution timer provided by the CPU for each of the threads.
struct timespect *tp用来存储当前的时间,其结构如下:
 
 
代码
1 struct timespec {2 time_t tv_sec; /* seconds */3 long tv_nsec; /* nanoseconds */4 };
 
 
1 #include <iostream>
2 #include <time.h>
3 using namespace std;
4
5 timespec diff(timespec start, timespec end);
6
7 int main()
8 {
9 timespec time1, time2;
10 int temp;
11 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
12 for (int i = 0; i< 242000000; i++)
13 temp+=temp;
14 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
15 cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
16 return 0;
17 }
18
19 timespec diff(timespec start, timespec end)
20 {
21 timespec temp;
22 if ((end.tv_nsec-start.tv_nsec)<0) {
23 temp.tv_sec = end.tv_sec-start.tv_sec-1;
24 temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
25 } else {
26 temp.tv_sec = end.tv_sec-start.tv_sec;
27 temp.tv_nsec = end.tv_nsec-start.tv_nsec;
28 }
29 return temp;
30 }
### C++ 中实现计时功能的方法 在 C++ 编程中,可以通过多种方式来实现计时功能。以下是几种常见的方式及其具体实现: #### 使用 `clock()` 函数 `<ctime>` 头文件中的 `clock()` 函数可以用来测量程序运行时间。它返回自程序启动以来经过的处理器时间(单位为时钟滴答数)。通过两次调用该函数并取差值即可得到某段代码执行所需的时间。 下面是一个简单的例子[^1]: ```cpp #include <iostream> #include <ctime> int main() { clock_t start = clock(); // 耗时操作 for (size_t i = 0; i < 100000; ++i) { std::cos(1); std::sin(1); std::tan(1); } clock_t end = clock(); double elapsed_time = static_cast<double>(end - start) / CLOCKS_PER_SEC; std::cout << "花费了" << elapsed_time << "秒" << std::endl; return 0; } ``` 此方法适用于粗略估计代码片段的执行时间,但对于高精度的需求可能不够理想。 --- #### 高精度计时:`std::chrono` 为了更精确地测量时间间隔,C++ 提供了一个现代的标准库 `<chrono>` 来处理日期和时间。它可以用于微秒甚至纳秒级别的计时。 以下是如何利用 `std::chrono` 进行计时的一个实例[^2]: ```cpp #include <iostream> #include <chrono> int main() { auto start = std::chrono::high_resolution_clock::now(); // 测试代码 for (size_t i = 0; i < 100000; ++i) { std::cos(1); std::sin(1); std::tan(1); } auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> duration = end - start; std::cout << "花费了" << duration.count() << " 秒" << std::endl; return 0; } ``` 这种方法不仅支持更高的分辨率,还提供了灵活的时间表示形式,适合于需要精准控制的应用场景。 --- #### Windows 平台专用 API 如果目标环境仅限于 Windows,则可考虑使用其特有的高性能计时器接口——QueryPerformanceCounter 和 QueryPerformanceFrequency。这些函数能够提供极高的时间粒度。 下面是基于上述两个函数的一段示范代码[^3]: ```cpp #include <windows.h> #include <iostream> void HighPrecisionTimerExample() { LARGE_INTEGER frequency, startTime, endTime; QueryPerformanceFrequency(&frequency); QueryPerformanceCounter(&startTime); // 执行待测逻辑 for (size_t i = 0; i < 100000; ++i) { std::cos(1); std::sin(1); std::tan(1); } QueryPerformanceCounter(&endTime); double elapsedTime = (static_cast<double>(endTime.QuadPart - startTime.QuadPart)) / frequency.QuadPart; std::cout << "花费了" << elapsedTime << " 秒" << std::endl; } int main() { HighPrecisionTimerExample(); return 0; } ``` 这种方案特别推荐给那些专注于 Windows 开发者群体的人士。 --- #### 自定义计时器类设计 对于复杂项目而言,创建一个通用的计时器类可能是更好的选择。此类封装了所有的计时细节,从而简化了实际应用过程中的编码工作量[^4]。 示例如下: ```cpp #include <iostream> #include <chrono> class Timer { public: Timer() : m_start(std::chrono::high_resolution_clock::now()) {} ~Timer() { Stop(); } void Stop() { if (!m_stopped) { auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> elapsed = end - m_start; std::cout << "总耗时:" << elapsed.count() << " 秒\n"; m_stopped = true; } } private: std::chrono::time_point<std::chrono::high_resolution_clock> m_start; bool m_stopped{false}; }; // 示例用法 int main() { Timer timer; for (size_t i = 0; i < 100000; ++i) { std::cos(1); std::sin(1); std::tan(1); } return 0; } ``` 这种方式提高了代码重用性和维护便利性,尤其当多个地方都需要类似的计时期望时显得尤为重要。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值