Если Вы хотите тактовое стеной время
long start_time = System.currentTimeMillis();
object.method();
long end_time = System.currentTimeMillis();
long execution_time = end_time - start_time;
Точность функции time.sleep зависит от точности сна вашей базовой ОС. Для ОС, не работающих в реальном времени, таких как стандартная Windows, наименьший интервал, в течение которого вы можете спать, составляет около 10-13 мс. Я видел точный сон в течение нескольких миллисекунд того времени, когда он превышал минимальные 10-13 мсек.
Обновление: Как упоминалось в документах, цитируемых ниже, обычно засыпают в цикле, который обязательно вернет вас в режим сна, если он вас разбудит рано.
Я также должен упомянуть, что если вы используете Ubuntu, вы можете попробовать ядро псевдореального времени (с установленным патчем RT_PREEMPT) путем установки пакета ядра rt (по крайней мере, в Ubuntu 10.04 LTS).
РЕДАКТИРОВАТЬ: Ядра Linux исправления не в реальном времени имеют минимальный интервал сна, намного ближе к 1 мс, а затем к 10 мс, но оно изменяется недетерминированным образом.
Почему вы не узнаете:
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.
В отношении sleep () вы ничего не можете гарантировать, за исключением того, что он, по крайней мере, будет делать все возможное, чтобы уснуть, пока вы ему сказали (сигналы могут убить ваш сон до того, как истечет время).
Конечно, минимум, который вы можете получить в стандартной настольной операционной системе, составит около 16 мс (детализация таймера плюс время переключения контекста), но есть вероятность, что % отклонение от предоставленного аргумента будет значительным, когда вы пытаетесь заснуть в течение 10 миллисекунд.
Сигналы, другие потоки, содержащие GIL, функции планирования ядра, ступенчатое изменение скорости процессора и т. Д. - все это может нанести ущерб продолжительности фактического ожидания вашего потока / процесса.
From the documentation:
On the other hand, the precision of
time()
andsleep()
is better than their Unix equivalents: times are expressed as floating point numbers,time()
returns the most accurate time available (using Unixgettimeofday
where available), andsleep()
will accept a time with a nonzero fraction (Unixselect
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.