C++中計算程式的執行時間
阿新 • • 發佈:2018-12-12
在我們實際開發中,尤其對於演算法工程師來說,有時候為了比較不同的演算法或者優化演算法,需要計算各個演算法執行的時間或者關鍵程式碼段的執行時間,以此來衡量演算法在速度上的優劣或者進行程式碼優化時的一個參考。
因此對於程式設計師來說,如何計算程式的執行時間就是一個需要解決的基本問題了。對於C++來說,在C++11之前並沒有與時間相關的直接的標準庫,基本上是使用C語言中對時間進行處理的相關功能,或者直接使用和平臺相關的系統API。
然而在C++11之後,C++標準庫提供了一個用來處理日期和時間的程式庫,常被稱為chrono程式庫
,因為它的特性被定義於<chrono>
。有了這個程式庫,就不用再去尋找關於不同平臺的時間處理API了,直接支援跨平臺,現在想想,使用C++(尤其是Modern C++)是多麼舒服的一件事呀。
好了,現在我們可以直接使用<chrono>
庫中提供的相關功能來進行程式執行時間的測量了,如:
#include <chrono>
...
auto start = std::chrono::steady_clock::now();
for (int i = 0; i < 1024; ++i) {
std::cout << "hello C++11 !" << std::endl;
}
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double, std::micro> elapsed = end - start; // std::micro 表示以微秒為時間單位
std::cout<< "time: " << elapsed.count() << "us" << std::endl;
...
現在可以對需要進行測量的程式碼段或演算法按如上方法進行測量,二話不說,拿起鍵盤就是複製貼上,額…
當然可以按照上述方式去做,但是為了今後使用的方便以及程式碼的複用,所以對其進行了一個簡單的封裝,並將其放在了我的 Github 上,如果有需要的讀者可以直接拿來使用。
基於<chrono>
AlgoTime
模板類,支援以不同的時間單位進行計算,比如納秒、微妙、毫秒、秒等等;另外也可以直接使用像 AlgoTimeNs
(納秒)、AlgoTimeUs
(微秒)、AlgoTimeMs
(毫秒)等型別,具體實現可參見原始碼。
下面就以AlgoTimeUs
為例子,做一個簡單的使用示例:
#include "MeasureAlgoTime.hpp"
int main() {
// 建立一個以“微秒”為單位的演算法時間物件
// 當然也可以使用其它時間單位的時間物件,如毫秒、秒等
Tools::Time::AlgoTimeUs time;
// 啟動計時
time.start();
for (int i = 0; i < 1024; ++i) {
std::cout << "hello C++11 !" << std::endl;
}
// 直接在標準輸出裝置中輸出程式的執行時間
time.printElapsed();
// 或者使用以下方式進行執行時間的輸出
auto elapsed = time.elapsed();
std::cout << elapsed << "us" << std::endl;
return 0;
}
在gcc 7.3.0
上的執行結果如下所示: