Проблема с таймингом

110
17 ноября 2021, 11:40

Вечер добрый. Есть программа для эмуляции. Беда в том, что мне нужно ловить тайминг. Но почему-то после выхода из цикла имею очень большое значение ожидания.

#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;
}

Имею суммарное время ожидания 134. Мне надо прождать это время / 5 в цикле. Он верно ждёт по 26мс. Но в последнем выводе показывает время всех итераций 170ms+, хотя 26*5=130. В чём может быть проблема ?

Answer 1

У Sleep есть гранулярность - он будет ждать минимум указанное время, но обычно больше, округляя до приблизительно 16мс кванта. Пять раз поспали - получили 8мс*5 ~= 40мс дополнительного ожидания.

Answer 2

Потому, что у вас внутри цикла производятся вычисления, организовывается вывод на экран, а потом еще и в конце, до вычисления разницы, производится вывод.

Перепишите программу вот так

int main()
{
    int wait = 134;
    int swait = wait / 5;
    clock_t fullbetween = clock();
    for (int i = 0; i < 5; i++) {
        Sleep(swait);
        // cout << wait / 5 << "  ";
    }
    double diff = diffclock(fullbetween);
    cout << endl << "finish in " << diff << " ms" << endl;
    return 0;
}

и погрешность будет пара миллисекунд

Answer 3

Насколько я понимаю, выполняем :

  1. сравнение i < 5;

  2. ждем 26мс

  3. вывод cout << wait / 5 << " "; Все это 5 раз.

  4. выводим cout << endl << "finish in " и выполняем инкремент

  5. вызываем функцию

  6. выполняется тело функции

    И к результату 5 * 26 еще нужно добавить (время на п1 и п3) * 5 + время на п4 + время на п6 и время которое может съедать операционная система. И все это с небольшой погрешностью у вас равен 170ms

READ ALSO
скрыть часть option на bootstrap

скрыть часть option на bootstrap

как в bootstrap в выподающем списке скрыть часть option ? есть список

170
Почему не отображается линия canvas?

Почему не отображается линия canvas?

Все привет, хочу сделать сайт чтобы строить график линейной функции через canvas

267
Прошу совета js

Прошу совета js

Нужно вызывать смену координат карты при определенном условии

143
Пропадают картинки в slick slide при адаптиве

Пропадают картинки в slick slide при адаптиве

Добрый вечер проблема следуйщая, при респонсиве слайдера пропадают его картинки

200