本文将详细介绍常用的CPU计时函数,并通过实例代码演示如何使用这些函数来精确测量代码的执行时间。
一、为什么需要计时函数?
在程序开发中,常常需要知道某段代码的执行时间,以便:
-
性能优化:找出程序中的性能瓶颈。
-
算法比较:比较不同算法或实现的效率。
-
调试:检查代码是否按预期时间运行。
CPU计时函数可以精确测量代码段的执行时间,从而为上述任务提供数据支持。
二、常用的CPU计时函数
1. clock() 函数
clock() 是C标准库中的一个函数,返回程序从启动到调用该函数时所用的CPU时间(以时钟周期为单位)。
函数原型:
#include <time.h>
clock_t clock(void);
示例代码:
#include <stdio.h>
#include <time.h>
int main() {
clock_t start, end;
double cpu_time_used;
start = clock(); // 记录起始时间
// 模拟耗时操作
for (long i = 0; i < 100000000; i++);
end = clock(); // 记录结束时间
cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC; // 计算时间差
printf("CPU 时间: %.6f 秒\n", cpu_time_used);
return 0;
}
注意事项:
-
clock()返回的是CPU时间,而不是实际时间。 -
在多线程程序中,
clock()可能会返回所有线程的CPU时间总和。
2. gettimeofday() 函数
gettimeofday() 是一个POSIX标准的函数,用于获取当前时间(精确到微秒)。
函数原型:
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
示例代码:
#include <stdio.h>
#include <sys/time.h>
int main() {
struct timeval start, end;
double time_used;
gettimeofday(&start, NULL); // 记录起始时间
// 模拟耗时操作
for (long i = 0; i < 100000000; i++);
gettimeofday(&end, NULL); // 记录结束时间
time_used = (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1000000.0; // 计算时间差
printf("实际时间: %.6f 秒\n", time_used);
return 0;
}
注意事项:
-
gettimeofday()返回的是实际时间,适合测量I/O操作等耗时。 -
该函数已被标记为过时,建议使用
clock_gettime()。
3. clock_gettime() 函数
clock_gettime() 是一个高精度的计时函数,支持多种时钟类型(如 CLOCK_MONOTONIC 和 CLOCK_REALTIME)。
函数原型:
#include <time.h>
int clock_gettime(clockid_t clk_id, struct timespec *tp);
示例代码:
#include <stdio.h>
#include <time.h>
int main() {
struct timespec start, end;
double time_used;
clock_gettime(CLOCK_MONOTONIC, &start); // 记录起始时间
// 模拟耗时操作
for (long i = 0; i < 100000000; i++);
clock_gettime(CLOCK_MONOTONIC, &end); // 记录结束时间
time_used = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1000000000.0; // 计算时间差
printf("实际时间: %.6f 秒\n", time_used);
return 0;
}
注意事项:
-
CLOCK_MONOTONIC是一个单调递增的时钟,不受系统时间调整的影响。 -
CLOCK_REALTIME是系统实时时钟,可能会受到时间调整的影响。
4. C++11 的 std::chrono
C++11 引入了 <chrono> 库,提供了高精度的计时工具。
示例代码:
#include <iostream>
#include <chrono>
int main() {
auto start = std::chrono::high_resolution_clock::now(); // 记录起始时间
// 模拟耗时操作
for (long i = 0; i < 100000000; i++);
auto end = std::chrono::high_resolution_clock::now(); // 记录结束时间
std::chrono::duration<double> time_used = end - start; // 计算时间差
std::cout << "实际时间: " << time_used.count() << " 秒\n";
return 0;
}
注意事项:
-
std::chrono提供了高精度的计时功能,适合C++程序。 -
支持多种时间单位(如纳秒、微秒、毫秒等)。
三、如何选择合适的计时函数?
| 函数 | 精度 | 适用场景 | 注意事项 |
|---|---|---|---|
clock() | 低 | CPU时间测量 | 多线程程序可能不准确 |
gettimeofday() | 微秒级 | 实际时间测量 | 已过时,建议使用 clock_gettime |
clock_gettime() | 纳秒级 | 高精度实际时间测量 | 推荐使用 CLOCK_MONOTONIC |
std::chrono | 纳秒级 | C++程序的高精度计时 | 适合现代C++程序 |
四、总结
CPU计时函数是程序开发和性能优化的重要工具。本文介绍了常用的计时函数,包括 clock()、gettimeofday()、clock_gettime() 和 std::chrono,并通过示例代码演示了它们的使用方法。笔者常用的函数是gettimeofday()。

415

被折叠的 条评论
为什么被折叠?



