在 C++ 中使用定时器

Jinku Hu 2023年10月12日
  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 <chrono>
#include <iostream>

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 <sys/time.h>

#include <ctime>
#include <iostream>

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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C++ Timer