在 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