Почему измерение времени иногда возвращает повторяющиеся значения (кратные 15,625 мс)? - PullRequest
0 голосов
/ 27 мая 2018

Я много занимался поиском и нашел похожие вопросы, но до сих пор не могу понять, почему иногда мой код получает правильное время, а в других случаях решает стать бесполезным и возвращать повторяющиеся значения.

Простой код C ++, который вы можете запустить, чтобы проверить это:

#include <iostream>
#include <chrono>
#include <windows.h>
//#include <unistd.h>  //For Unix

void stall(int milisseconds){
    auto start = std::chrono::high_resolution_clock::now();

    Sleep(milisseconds);
    //usleep(milisseconds*1000);   //For Unix

    auto finish = std::chrono::high_resolution_clock::now();
    std::cout<<std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count()/1000000.0<<" ms\n";
}

int main(){
    std::cout<<"Begin\n";
    for (int i = 1; i < 100; i++){
        stall(i);
    }
}

При выполнении этого ожидаемый результат будет выглядеть примерно так:

1 ms
2 ms
3 ms
4 ms
...
98 ms
99 ms
100 ms

Иногда это работает,но в других случаях (например, наугад) выходные данные выглядят так:

15.625 ms
15.62 ms
15.632 ms
7.997 ms
16.713 ms
15.637 ms
31.25 ms
31.263 ms
31.245 ms
31.25 ms
21.985 ms
...
93.718 ms
93.77 ms
93.744 ms
102.263 ms
109.369 ms
96.192 ms
109.367 ms
109.368 ms

Как я могу устранить это ужасное несоответствие?Сокращение числа фоновых процессов, похоже, не имеет никакого эффекта.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

einpoklum предположил, что это может быть из-за кванта планирования моей ОС, что звучит примерно так.Я собирался сходить с ума, думая, что это было что-то вне моего контроля (или слишком сложно решить), но в итоге я каким-то образом нашел способ манипулировать этим в свою пользу.Я заметил, что, если интернет-браузер был закрыт, возвращенное время было очень последовательной последовательностью, кратной 15,625.Но если бы у меня был запущен браузер, это выглядело так, как будто я открывал больше вкладок, тем более несовместимым было время (но все еще склонялось к коэффициентам, кратным 15,625).И если на вкладке было что-то загрузка , числа стали выглядеть как обычная последовательность от 1 до 1!

Итак, я пришел к выводу, что когда бы мне ни пришлось проводить тестирование, я бы поставил вкладку Youtube или Twitch рядом.Это чертовски странно (если есть лучший способ сделать это, я хотел бы знать), но сейчас мне придется объединить полезное с приятным, lol

0 голосов
/ 27 мая 2018

Я полагаю, это может быть связано с квантом планирования вашей ОС: если ваш поток выдает или завершает свой квант времени выполнения, некоторые другие потоки будут работать для этого кванта, а затем, когда ваш поток запускается снова, полный квант (инемного) прошло.Таким образом, вы видите прогресс по шуму + либо 0 квантов, либо 1 квант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...