Задать вопрос
@b1nary
php junior

Как сделать задержку выполнения скрипта < 10 миллисекунд?

Есть цикл, внутри функция usleep() приостанавливает выполнение каждой итерации на заданное количество микросекунд (миллионных секунды). Мне надо, чтобы скрипт приостанавливался на 10 миллисекунд (т.е. 10 тысячных секунды). Выглядит примерно так:

for($i = 1; $i <= 1000; $i ++){
    /*
    * какой-то код
    */
    usleep(10000); //это 0,010 секунды
}


Проблема в том, что задержка 10 и менее 10 миллисекунд не получается, минимум 20 миллисекунд. Вот что примерно по теме пишут:
Задержки менее 50 миллисекунд (в зависимости от скорости процессора, машины, и загрузки системы) не представляются возможными, т.к. для возвращения управления процессу в Linux тратится, как минимум, 10-30 миллисекунд. Указание таких задержек для usleep(3), на самом деле, приведет к большей задержке (уж, как минимум, в 10 мс).

Вопрос: есть ли возможность уменьшить задержку в usleep() менее 10 миллисекунд? Как же тогда time_nanosleep(), где возможна задержка на 1 миллиардную секунды? Сервер стоит на FreeBSD 9.1
  • Вопрос задан
  • 8591 просмотр
Подписаться 6 Оценить 6 комментариев
Решения вопроса 1
morozovdenis
@morozovdenis
$lastTime = microtime(true);

for($i = 1; $i <= 1000; $i ++){
    while (true)
    {
           $new_last = microtime(true);
           if ($new_last - $lastTime > 0.010)
           {
                    $lastTime = $new_last;
                    break;
           }
    }

    /*
    * какой-то код
    */
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
morozovdenis
@morozovdenis
стало любопытно мне, пошёл php вспоминать

у меня этот код:
var_dump(number_format(microtime(true), 6));
time_nanosleep(0, 10 * 1000 * 1000);
echo "<br />";
var_dump(number_format(microtime(true), 6));
вывел следующее:
string(20) "1,396,895,032.113305" 
string(20) "1,396,895,032.123673"

time_nanosleep - всё правильно усыпила на 10 милисекунд
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как же тогда time_nanosleep() где возможна задержка на 1 миллиардную секунды

Кто вам сказал? Можно указать желаемое время с точностью 1нс, но какова будет реальная задержка -- зависит от очень, очень многих факторов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы