簡體   English   中英

C++ chrono::duration_cast 總是輸出“0 秒”

[英]C++ chrono::duration_cast always outputs "0 seconds"

這是我在這里提出的第一個問題,我也是 C++ 的完全新手,但我會盡力做到盡可能具體。 如果我含糊不清,請告訴我:

我正在嘗試使用 chrono 和 duration_cast 測量排序方法(合並排序)對給定整數數組進行排序所需的時間。 這是有問題的代碼片段:

    auto t1 = std::chrono::high_resolution_clock::now();
    mergesort(sortingArray, temp, 0, num - 1);
    auto t2 = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> fp_ms = t2 - t1;
    std::cout << fp_ms.count() << " seconds\n";

我得到的輸出總是“0 秒”,無論我制作它需要排序的數組有多大。 即使它對一百萬個整數進行排序並且有明顯的執行時間,它仍然給我相同的輸出。

我基本上遵循這里給出的例子: http : //en.cppreference.com/w/cpp/chrono/duration/duration_cast

我只是使用我的合並排序函數而不是 f() 。 我怎樣才能讓它正確衡量我的排序方法?

編輯:我在 Windows 10 中使用 minGW 通過 Powershell 進行編譯。命令如下所示:

g++ -std=c++11 .\Merge.cpp

TL;DR :看起來std::chrono實現(libstdc++)在 Windows 上很差,你不會得到比秒更好的東西。

長版:

libstdc++ typedef s std::chrono::high_resolution_clockstd::chrono::system_clock 根據實現,調用std::chrono::system_clock::now()將導致調用以下之一,具體取決於平台:

  • syscall(SYS_clock_gettime, CLOCK_REALTIME, ...) ,這是一個 Linux 系統調用
  • clock_gettime(CLOCK_REALTIME, ...) ,這是 Windows 不支持的 POSIX 系統調用
  • gettimeofday(...) ,這是 Windows 不支持的 POSIX 函數
  • std::time()作為后備

因此, std::time()在 Windows 上被內部調用。 未指定std::time()的編碼; 但是,大多數系統都遵循POSIX 規范

time() 函數應返回自 Epoch 以來的時間值(以秒為單位)

微軟本身並沒有相同的

返回自 1970 年 1 月 1 日午夜以來經過的秒數,如果出現錯誤,則返回 -1。

我認為可以肯定地說,使用 MingW 的std::chrono chrono 不會獲得更高的分辨率。

至於你的問題,你有兩個選擇:

  1. 如果您的程序僅在 Windows 上運行,您可以使用QueryPerformanceCounter構建自己的時間測量
  2. 如果你想保持它的便攜性,請使用Boost.Chrono 它使用本機 Windows API ,應該提供更好的分辨率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM