Насколько точны время наступления, действительно? - программирование
Подтвердить что ты не робот

Насколько точны время наступления, действительно?

Требования к заявке на время, дающие наносекундную точность. http://golang.org/src/pkg/time/time.go

Мне интересно, как это реализовано, и если я могу доверять этому. Мои сомнения исходят от Python, который четко документирует свои трудности и ограничения со временем:

Из http://docs.python.org/2/library/time.html

Точность различных функций реального времени может быть меньше предложенных единицами, в которых выражается их значение или аргумент. Например. на большинстве систем Unix часы "тикают" всего в 50 или 100 раз второй.

С другой стороны, точность времени() и sleep() лучше, чем их эквиваленты Unix: времена выражаются как числа с плавающей запятой, time() возвращает наиболее точное время (используя Unix gettimeofday(), если доступно), а sleep() будет принимать время с ненулевая фракция (Unix select() используется для реализации этого, где имеется).

Так как операционные системы так трудны для python, как Go Go достигает своей наносекундной точности?

4b9b3361

Ответ 1

Что касается реализации, time.Now() возвращается к функции, реализованной во время выполнения. Вы можете просмотреть временную реализацию C и реализацию для time·now в сборке (linux amd64 в этом случае). Затем используется clock_gettime, который обеспечивает разрешение nano секунд. В окнах это реализуется при вызове GetSystemTimeAsFileTime, который тоже генерирует наносекунды (не так высоко, но наносекунды).

Итак, да, разрешение зависит от операционной системы, и вы не можете ожидать, что оно будет точным в каждой ОС, но разработчики стараются сделать так же хорошо, как может быть. Например, в go1.0.3, time·now для FreeBSD используется gettimeofday вместо clock_gettime, который предлагает только миллисекундную точность. Вы можете увидеть это, посмотрев на значение, хранящееся в AX, так как это syscall id. Если вы взглянете на ссылочную сборку, вы увидите, что значение ms умножается на 1000, чтобы получить наносекунды. Тем не менее, это фиксировано теперь.

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

Ответ 2

Одна из проблем с Python time.time заключается в том, что он возвращает float. Поплавок - это номер двойной точности IEEE 754, который имеет 53 бит точности.

Так как теперь с 1970-01-01 (эпоха) прошло более 2 ** 30 секунд, вам нужно 61 (31 + 30) бит точности для хранения времени с точностью до наносекунды с 1970-01-01 гг.

К сожалению, это на 7 или 8 бит меньше, чем вы можете хранить в поплавке python, что означает, что поплавки python всегда будут менее точными, чем время выполнения.

Чтобы определить, что приведенная ниже демонстрация показывает, что время python максимально точно соответствует 100nS только из-за ограничений типа float.

>>> t = time()
>>> t
1359587524.591781
>>> t == t + 1E-6
False
>>> t == t + 1E-7
True

Итак, идем, начиная с int64, и подсчет в nS не имеет этих ограничений и ограничивается точностью базовой ОС, как очень хорошо объясняется nemo.