在 C++ STL 中测量一个函数的执行时间

Jinku Hu 2023年10月12日
  1. 使用 std::chrono::high_resolution_clock::nowstd::chrono::duration_cast<std::chrono::seconds> 来测量功能的执行时间
  2. 使用 std::chrono::high_resolution_clock::nowstd::chrono::duration<double, std::milli> 来测量函数的执行时间
在 C++ STL 中测量一个函数的执行时间

本文将演示有关如何测量 C++ 中函数执行时间的多种方法。

使用 std::chrono::high_resolution_clock::nowstd::chrono::duration_cast<std::chrono::seconds> 来测量功能的执行时间

std::chrono 命名空间合并了 C++ STL 库提供的所有日期和时间实用程序。后者提供了多种时钟实现,其中之一是 std::chrono::high_resolution_clock,它对应于最小滴答周期的时钟。但是请注意,此时钟与硬件平台有关,甚至多个标准库的实现也有所不同,因此最好阅读编译器文档,并确保此文档适合于问题要求。测量函数执行时间的想法是从给定的时钟中两次检索当前时间:函数调用之前和之后,然后计算两个值之间的差。使用 now 内置方法检索当前时间。一旦计算出差异,就应该在一定的时间单位内解释它,这可以使用 std::chrono::duration_cast 实用程序来完成。在下面的示例中,我们将结果转换为 std::chrono::seconds 单位,并使用 count 内置函数输出该值。注意,代码示例中的 funcSleep 将暂停程序执行 3 秒钟,然后将控制权返回给 main 函数。

#include <chrono>
#include <iostream>
#include <thread>

using std::cout;
using std::endl;

void funcSleep() { std::this_thread::sleep_for(std::chrono::seconds(3)); }

int main() {
  auto start = std::chrono::high_resolution_clock::now();
  funcSleep();
  auto end = std::chrono::high_resolution_clock::now();

  auto int_s = std::chrono::duration_cast<std::chrono::seconds>(end - start);

  std::cout << "funcSleep() elapsed time is " << int_s.count() << " seconds )"
            << std::endl;

  return EXIT_SUCCESS;
}

输出:

funcSleep() elapsed time is 3 seconds

使用 std::chrono::high_resolution_clock::nowstd::chrono::duration<double, std::milli> 来测量函数的执行时间

与前一个代码将时间单位保存为整数值相反,下一个示例在 std::chrono::duration<double, std::milli> 类型中将间隔值存储为浮点数。std::chrono::duration 是用于表示时间间隔的通用类模板。最后,使用 count 函数检索间隔值,此时可以将其打印到 cout 流中。

#include <chrono>
#include <iostream>
#include <thread>

using std::cout;
using std::endl;

void funcSleep() { std::this_thread::sleep_for(std::chrono::seconds(3)); }

int main() {
  auto start = std::chrono::high_resolution_clock::now();
  funcSleep();
  auto end = std::chrono::high_resolution_clock::now();

  std::chrono::duration<double, std::milli> float_ms = end - start;

  std::cout << "funcSleep() elapsed time is " << float_ms.count()
            << " milliseconds" << std::endl;

  return EXIT_SUCCESS;
}

输出:

funcSleep() elapsed time is 3000.27 milliseconds

过去的两个示例测量了一个函数,该函数通常花费固定时间,但是可以使用类似的方法来计算给定代码块的执行时间。例如,以下代码片段演示了随机整数生成函数,该函数需要更多可变间隔来执行。请注意,这次,我们使用了两种方法来显示时间,以毫秒为单位,以秒为单位。

#include <chrono>
#include <iostream>
#include <thread>

using std::cout;
using std::endl;

constexpr int WIDTH = 1000000;

void generateNumbers(int arr[]) {
  std::srand(std::time(nullptr));
  for (size_t i = 0; i < WIDTH; i++) {
    arr[i] = std::rand();
  }
}

int main() {
  int *arr = new int[WIDTH];

  auto start = std::chrono::high_resolution_clock::now();
  generateNumbers(arr);
  auto end = std::chrono::high_resolution_clock::now();

  std::chrono::duration<double, std::milli> float_ms = end - start;
  auto int_ms =
      std::chrono::duration_cast<std::chrono::milliseconds>(end - start);

  std::chrono::duration<long, std::micro> int_usec = int_ms;

  std::cout << "generateNumbers() elapsed time is " << float_ms.count()
            << " ms "
            << "( " << int_ms.count() << " milliseconds )" << std::endl;

  delete[] arr;
  return EXIT_SUCCESS;
}

输出:

generateNumbers() elapsed time is 30.7443 ms ( 30 milliseconds )
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

LinkedIn Facebook

相关文章 - C++ Time