在 C++ 中使用定时器

Jinku Hu 2023年1月30日 2021年1月4日
  1. 使用 clock() 函数在 C++ 中实现一个定时器
  2. 使用 gettimeofday 函数在 C++ 中实现一个定时器
在 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 而不是有效的时区 structgettimeofday 将时区数据存储在名为 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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

相关文章 - C++ Timer