在 C++ 中使用定时器
本文将演示如何在 C++ 中使用定时器的多种方法。
使用 clock()
函数在 C++ 中实现一个定时器
clock()
函数是一个符合 POSIX 标准的方法,用于检索程序的处理器时间。该函数返回需要除以一个名为 CLOCKS_PER_SEC
的宏定义常数的整数值,以转换为几秒钟。
下面的示例代码实现了两个函数,用于查找 int
数组中的最大值。max_index
函数是基于元素的索引进行搜索,而 max_value
则是基于值进行搜索。我们的目标是计算他们花了多少时间在充满随机整数的 1,000,000
元素数组中寻找最大值。
注意,我们调用了两次 clock()
函数-在调用 max_index
之前,然后在调用之后。通常可以采用这种时间测量方案,而不必考虑检索时间的具体函数。在这种情况下,我们可能会看到(取决于硬件系统),max_value
比基于索引的搜索更快地完成工作。不过要注意,这些最大搜索算法有 O(N)
的复杂度,不应该在任何专业的代码库中采用,仅仅用于实验中。
#include <iostream>
#include <chrono>
using std::cout; using std::endl;
int max_index(int arr[], int size){
size_t max = 0;
for (int j = 0; j < size; ++j) {
if (arr[j] > arr[max]) {
max = j;
}
}
return arr[max];
}
int max_value(int arr[], int size){
int max = arr[0];
for (int j = 0; j < size; ++j) {
if (arr[j] > max) {
max = arr[j];
}
}
return max;
}
constexpr int WIDTH = 1000000;
int main() {
clock_t start, end;
int max;
int *arr = new int[WIDTH];
std::srand(std::time(nullptr));
for (size_t i = 0; i < WIDTH; i++) {
arr[i] = std::rand();
}
start = clock();
max = max_index(arr, WIDTH);
end = clock();
printf ("max_index: %0.8f sec, max = %d\n",
((float) end - start)/CLOCKS_PER_SEC, max);
start = clock();
max = max_value(arr, WIDTH);
end = clock();
printf ("max_value: %0.8f sec, max = %d\n",
((float) end - start)/CLOCKS_PER_SEC, max);
exit(EXIT_SUCCESS);
}
输出:
max_value: 0.00131400 sec, max = 2147480499
max_value: 0.00089800 sec, max = 2147480499
使用 gettimeofday
函数在 C++ 中实现一个定时器
gettimeofday
是基于 Linux 系统的高精度时间检索函数,也可以从 C++ 源码中调用。该函数的设计初衷是为了获取时间和时区数据,但后者已经被弃用一段时间了,第二个参数应该是 nullptr
而不是有效的时区 struct
。gettimeofday
将时区数据存储在名为 timeval
的特殊结构体中,它包含两个数据成员:tv_sec
代表秒,tv_usec
代表微秒。
一般来说,在调用函数 gettimeofday
之前,我们先声明并初始化这两个 timeval
结构。一旦函数被调用,如果 gettimeofday
的返回值是 0
,那么数据应该成功地存储在相应的结构体中。否则,以返回 -1
值表示失败。注意,结构体中充满数据后,需要转换为时间的通用单位值。本示例代码实现了 time_diff
函数,该函数以秒为单位返回时间,可以根据需要输出到控制台。
#include <iostream>
#include <sys/time.h>
#include <ctime>
using std::cout; using std::endl;
int max_index(int arr[], int size){
size_t max = 0;
for (int j = 0; j < size; ++j) {
if (arr[j] > arr[max]) {
max = j;
}
}
return arr[max];
}
int max_value(int arr[], int size){
int max = arr[0];
for (int j = 0; j < size; ++j) {
if (arr[j] > max) {
max = arr[j];
}
}
return max;
}
float time_diff(struct timeval *start, struct timeval *end){
return (end->tv_sec - start->tv_sec) + 1e-6*(end->tv_usec - start->tv_usec);
}
constexpr int WIDTH = 1000000;
int main() {
struct timeval start{};
struct timeval end{};
int max;
int *arr = new int[WIDTH];
std::srand(std::time(nullptr));
for (size_t i = 0; i < WIDTH; i++) {
arr[i] = std::rand();
}
gettimeofday(&start, nullptr);
max = max_index(arr, WIDTH);
gettimeofday(&end, nullptr);
printf("max_index: %0.8f sec, max = %d\n",
time_diff(&start, &end), max);
gettimeofday(&start, nullptr);
max = max_value(arr, WIDTH);
gettimeofday(&end, nullptr);
printf("max_value: %0.8f sec, max = %d\n",
time_diff(&start, &end), max);
exit(EXIT_SUCCESS);
}
输出:
max_value: 0.00126000 sec, max = 2147474877
max_value: 0.00093900 sec, max = 2147474877
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn