Насколько точный time.sleep Python ()?

Если Вы хотите тактовое стеной время

long start_time = System.currentTimeMillis();
object.method();
long end_time = System.currentTimeMillis();
long execution_time = end_time - start_time;
82
задан codeforester 25 April 2018 в 16:09
поделиться

4 ответа

Точность функции time.sleep зависит от точности сна вашей базовой ОС. Для ОС, не работающих в реальном времени, таких как стандартная Windows, наименьший интервал, в течение которого вы можете спать, составляет около 10-13 мс. Я видел точный сон в течение нескольких миллисекунд того времени, когда он превышал минимальные 10-13 мсек.

Обновление: Как упоминалось в документах, цитируемых ниже, обычно засыпают в цикле, который обязательно вернет вас в режим сна, если он вас разбудит рано.

Я также должен упомянуть, что если вы используете Ubuntu, вы можете попробовать ядро псевдореального времени (с установленным патчем RT_PREEMPT) путем установки пакета ядра rt (по крайней мере, в Ubuntu 10.04 LTS).

РЕДАКТИРОВАТЬ: Ядра Linux исправления не в реальном времени имеют минимальный интервал сна, намного ближе к 1 мс, а затем к 10 мс, но оно изменяется недетерминированным образом.

70
ответ дан 24 November 2019 в 09:09
поделиться

Почему вы не узнаете:

from datetime import datetime
import time

def check_sleep(amount):
    start = datetime.now()
    time.sleep(amount)
    end = datetime.now()
    delta = end-start
    return delta.seconds + delta.microseconds/1000000.

error = sum(abs(check_sleep(0.050)-0.050) for i in xrange(100))*10
print "Average error is %0.2fms" % error

Для записи, я получаю ошибку около 0,1 мс на моем HTPC и 2 мс на моем ноутбуке, обе машины с Linux.

16
ответ дан 24 November 2019 в 09:09
поделиться

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

Конечно, минимум, который вы можете получить в стандартной настольной операционной системе, составит около 16 мс (детализация таймера плюс время переключения контекста), но есть вероятность, что % отклонение от предоставленного аргумента будет значительным, когда вы пытаетесь заснуть в течение 10 миллисекунд.

Сигналы, другие потоки, содержащие GIL, функции планирования ядра, ступенчатое изменение скорости процессора и т. Д. - все это может нанести ущерб продолжительности фактического ожидания вашего потока / процесса.

2
ответ дан 24 November 2019 в 09:09
поделиться

From the documentation:

On the other hand, the precision of time() and sleep() is better than their Unix equivalents: times are expressed as floating point numbers, time() returns the most accurate time available (using Unix gettimeofday where available), and sleep() will accept a time with a nonzero fraction (Unix select is used to implement this, where available).

And more specifically w.r.t. sleep():

Suspend execution for the given number of seconds. The argument may be a floating point number to indicate a more precise sleep time. The actual suspension time may be less than that requested because any caught signal will terminate the sleep() following execution of that signal’s catching routine. Also, the suspension time may быть длиннее , чем требует произвольная сумма из-за планирование другой деятельности в system.

26
ответ дан 24 November 2019 в 09:09
поделиться
Другие вопросы по тегам:

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