C++ 計算程式運行時間

2022/09/23 C++

C++ 計時函式庫比較

本篇文章將提供 Windows 和 Linux 系統好用的時間計時方法。

  • 毫秒(millisecond) 10的負3次秒
  • 微秒(microsecond)10的負6次秒
  • 毫微秒(nanosecond)10的負9次秒

使用 Chrono 標準庫

在 C++11 中若要計算程式的執行時間,最佳方法是使用處理日期時間的 Chrono 標準庫,它的精度可達到毫微秒(nanosecond)。steady_clock 表示穩定的時間間隔。每次呼叫 now() 得到的時間總是比前一次的值大,因此每次 tick 都保證過了穩定的時間間隔。此外我們可以透過 duration_cast 轉換不同精度的時間單位。

#include <stdio.h>
#include <chrono>
#include <unistd.h>

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

    sleep(3);

    auto finish = std::chrono::high_resolution_clock::now();
    printf("Elapsed time in nanoseconds: %ld ns\n", std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count());
    printf("Elapsed time in microseconds: %ld µs\n", std::chrono::duration_cast<std::chrono::microseconds>(finish-start).count());
    printf("Elapsed time in milliseconds: %ld ms\n", std::chrono::duration_cast<std::chrono::milliseconds>(finish-start).count());
    printf("Elapsed time in seconds: %ld sec\n", std::chrono::duration_cast<std::chrono::seconds>(finish-start).count());
}

執行結果:

Elapsed time in nanoseconds: 3000115862 ns
Elapsed time in microseconds: 3000115 µs
Elapsed time in milliseconds: 3000 ms
Elapsed time in seconds: 3 sec

如果要印出單一個時間點 epoch 可以參考以下程式:

// If you want to print the time in milliseconds since epoch
auto durationSinceEpoch = start_time_.time_since_epoch();
auto nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(durationSinceEpoch).count();
std::cout << "Nanoseconds since epoch: " << nanos << std::endl;

使用 Linux 系統時間

本方使用函數 gettimeofday 來得到程式執行前後的時間,是調用 <sys/time.h> 取得當前系統時間。gettimeofday 是符合 POSIX 標準的函式,用於檢索系統時鐘,精度可達到微秒(microsecond,即μs)。

#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>

int main() {
    struct timeval START,END;
    double timeuse;
    gettimeofday(&START,NULL);

    sleep(3);

    gettimeofday(&END,NULL);
    timeuse = (END.tv_sec - START.tv_sec) + (double)(END.tv_usec - START.tv_usec)/1000000.0;
    printf("Elapsed time in seconds: %lf sec\n", timeuse);
    printf("Elapsed time in milliseconds: %lf ms\n", timeuse*1000);
}

執行結果:

Elapsed time in seconds: 3.000074 sec
Elapsed time in milliseconds: 3000.074000 ms

Windows 系統計時方法

透過 Windows 系統的高精度計時器 QueryPerformanceCounter 實現計時功能,精確度可達到微秒等級。

#include <stdio.h>
#include<windows.h> 
#include <unistd.h>

int main() {
    double time = 0;
    LARGE_INTEGER nFreq, nBeginTime, nEndTime;
    QueryPerformanceFrequency(&nFreq);
    QueryPerformanceCounter(&nBeginTime);// 開始計時

    sleep(3);

    QueryPerformanceCounter(&nEndTime);// 停止計時  
    time = (double)(nEndTime.QuadPart - nBeginTime.QuadPart) / (double)nFreq.QuadPart; // 計算程式執行時間單位為s
    printf("Elapsed time in seconds: %lf s\n", time);
}

Reference

鼓勵持續創作,支持化讚為賞!透過下方的 Like 拍手👏,讓創作者獲得額外收入~
版主10在2020年首次開設YouTube頻道,嘗試拍攝程式教學。想要了解更多的朋友歡迎關注我的頻道,您的訂閱就是最大的支持~如果想學其他什麼內容也歡迎許願XD
https://www.youtube.com/channel/UCSNPCGvMYEV-yIXAVt3FA5A

Search

    Table of Contents