簡體   English   中英

為什么在帶有Chrono的Windows上的C ++中,為什么我的循環不能旋轉不到一毫秒?

[英]Why can't I get a loop to spin for less than a millisecond in C++ on Windows with Chrono?

編輯:我正在使用VS2013和Windows 7上。

使用以下代碼,我希望時差至少為1微秒,但是,在執行時,它的時差至少為1000微秒(一毫秒)。 我無法將時間縮短到不到一毫秒的原因是什么? 有沒有辦法解決?

// SleepTesting.cpp : Defines the entry point for the console application.
//

#include <chrono>
#include "windows.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    FILETIME startFileTime, endFileTime;
    uint64_t ullStartTime, ullEndTime;
    bool sleep = true;
    auto start = std::chrono::system_clock::now();
    auto now = std::chrono::system_clock::now();
    auto elapsedTime = std::chrono::duration_cast<std::chrono::microseconds>(now - start);

    GetSystemTimeAsFileTime(&startFileTime);
    ullStartTime = static_cast<uint64_t>(startFileTime.dwHighDateTime) << 32 | startFileTime.dwLowDateTime;

    while (sleep)
    {
        now = std::chrono::system_clock::now();
        elapsedTime = std::chrono::duration_cast < std::chrono::microseconds > (now - start);
        if (elapsedTime.count() > 0)
        {
            sleep = false;
        }
    }

    GetSystemTimeAsFileTime(&endFileTime);
    ullEndTime = static_cast<uint64_t>(endFileTime.dwHighDateTime) << 32 | endFileTime.dwLowDateTime;
    uint64_t timeDifferenceHundredsOfNano = ullEndTime - ullStartTime;

    std::cout << "Elapsed time with Chrono library: " << elapsedTime.count() << " micro-seconds" << std::endl;
    std::cout << "Elapsed time with Windows.h FILETIME: " << timeDifferenceHundredsOfNano << " hundreds of nanoseconds" << std::endl;

    return 0;
}

由於您使用的是system_clock,因此我認為您無法在Windows 7上獲得微秒級的分辨率(至少從我所見)。 嘗試使用高分辨率時鍾,但即使這樣也不能總是起作用,因為Windows甚至不能保證兩次連續操作之間經過的時間少於一毫秒,即使不睡覺也是如此

VS2013中的IIRC,system_clock(和highres_clock)以時鍾滴答表示,即ms。 如果需要更高的分辨率,則可以使用所有Windows並查看QueryPerformanceCounter

LARGE_INTEGER startCount;
LARGE_INTEGER endCount;
LARGE_INTEGER frequency;
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&startCount);
{...}
QueryPerformanceCounter(&endCount);

double startTimeInMicroSec = startCount.QuadPart * (1000000.0 / frequency.QuadPart);
double endTimeInMicroSec = endCount.QuadPart * (1000000.0 / frequency.QuadPart);

// endTimeInMicroSec - startTimeInMicroSec

免責聲明:眼動編譯

暫無
暫無

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

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