簡體   English   中英

計時器損壞或其他

[英]Broken timer or something else

我有一些必須幫助我的程序,但我無法處理時間。
雇用是一個代碼:

#include <iostream>
using namespace std;
#include <time.h>
#include <Windows.h>

double diffclock(clock_t clock1) {
    clock_t clock2 = clock();
    double diffticks = clock1 - clock2;
    double diffms = diffticks / (CLOCKS_PER_SEC / 1000);

    return diffms;
}


int main()
{
    int wait = 134;
    clock_t fullbetween = clock();

    for (int i = 0; i < 5; i++) {
        Sleep(wait / 5);
        cout << wait / 5 << "  ";
    }
    cout << endl << "finish in " << diffclock(fullbetween) << " ms" << endl;
    return 0;
}

C++ 版本。 相同的結果:

#include <iostream>
#include <chrono>
#include <ctime>
#include <thread>
#include <Windows.h>


int main()
{
    int wait = 134;
    auto start = std::chrono::system_clock::now();

    for (int i = 0; i < 5; i++) {
        std::this_thread::sleep_for(std::chrono::milliseconds(wait/5));
    }
    auto end = std::chrono::system_clock::now();

    auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds> (end - start);

    std::cout << std::endl << "finish in " << int_ms.count() << " ms" << std::endl;
    return 0;
}

134 / 5 = 26 沒問題。 但在最后一個“cout”中,它表明所有迭代都花費了大約 170 毫秒,而不是預期的 130 毫秒。 為什么會這樣?

對不起我的英語。

https://docs.microsoft.com/en-gb/windows/win32/api/synchapi/nf-synchapi-sleep的睡眠 function 的文檔說

暫停當前線程的執行,直到超時間隔過去。

系統時鍾以恆定速率“滴答”。 如果 dwMilliseconds 小於系統時鍾的分辨率,則線程可能休眠的時間少於指定的時間長度。 如果 dwMilliseconds 大於 1 個滴答但小於 2 個滴答,則等待可能介於 1 到 2 個滴答之間,依此類推。

Windows 系統上的滴答聲通常為 15.6 毫秒(每秒 64 個滴答聲),因此 26 變為 31.2。 這是暫停線程可能再次激活的時間,不能保證它會立即開始執行。 所以你的五個睡眠變成了 156ms 加上一點開銷。

文檔繼續對此行為進行緩解,並警告緩解將影響系統電源使用等。

要提高睡眠間隔的准確性,請調用 timeGetDevCaps function 以確定支持的最小計時器分辨率,並調用 timeBeginPeriod function 將計時器分辨率設置為最小值。

在 std::this_thread::sleep_for 文檔中(在此處找到)

據說 function 至少在指定的 sleep_duration 內阻止當前線程的執行。

由於調度或資源爭用延遲,它可能會阻塞比 sleep_duration 更長的時間。

因此,您的代碼將至少需要 135 毫秒才能執行。

暫無
暫無

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

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