Получение неправильного значения миллисекундной задержки - PullRequest
2 голосов
/ 18 июня 2020

Я пытаюсь получить задержку в 1 миллисекунду, но у меня получается в 15 раз больше. Я также пробовал с функцией windows Sleep(1), которая также давала мне тот же результат. получить точную миллисекундную задержку?

Где как это работает с задержкой в ​​1 секунду.

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

void counter1();

auto main() -> int
{

    std::thread p(&counter1);
    p.join();
    return 0;
}

void counter1()
{
    int nStep = 0;
    const int STEP = 1000;
    auto start = std::chrono::high_resolution_clock::now();
    for (;;)
    {
        ++nStep; // incrementing every millisecond
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
        if (nStep == STEP) {  // compares at second
            auto duration = std::chrono::high_resolution_clock::now() - start;
            std::cout << "counter took " <<
                std::chrono::duration_cast<std::chrono::seconds>(duration).count()
                << "seconds \n";
            start = std::chrono::high_resolution_clock::now();
            nStep = 0;
        }
    }
}

Вывод этой программы: https://i.stack.imgur.com/AVZDV.png

Ответы [ 2 ]

5 голосов
/ 18 июня 2020

Вы не получаете ожидаемых результатов, потому что ваши ожидания не оправдываются. sleep_for - не ждать точного времени. From cppreference :

Блокирует выполнение текущего потока для по крайней мере указанного sleep_duration.

Эта функция может block на время больше, чем sleep_duration из-за задержек планирования или конфликта ресурсов.

Стандарт рекомендует использовать устойчивые часы для измерения продолжительности. Если в реализации вместо этого используются системные часы, время ожидания также может зависеть от настроек часов.

Точное время обычно требует специального оборудования. Ожидание 1 мс от настольного компьютера p c довольно оптимистично c.

Кроме того, время, которое вы измеряете, не только от sleep_for.

0 голосов
/ 18 июня 2020

Это происходит из-за двух вещей.

  1. ожидание - это не единственное, что вы делаете, увеличение и проверка операторов if также требуют времени.

  2. Нет идеальных часов

Также, если вы хотите бесконечное l oop while(true) выглядит лучше

...