Неверное время с System.currentTimeMillis () (Java)

Я сделал небольшую программу для тестирования System.currentTimeMillis (). И у меня странный результат. Это мои журналы:

1    26-12-09 20:48:21 - [Log] lTime = 1261860501009
2    26-12-09 20:48:21 - [Log] lTime = 1261860501012
3    26-12-09 20:48:21 - [Log] lTime = 1261864899078
4    26-12-09 20:48:21 - [Log] lTime = 1261860501033
5    26-12-09 20:48:21 - [Log] lTime = 1261860501069

Как видите, в строке 3 есть проблема. Миллис времени неверен. Это должно быть между 1261860501012 и 1261860501033. Ошибка составляет примерно 73 миллисекунды.

Кто-нибудь знает, откуда возникла проблема?

Большое спасибо

bill0ute

Редактировать: ОС: Debian 4.0, Java: 6_17.

Мой код:

while (true) 
    setLog (System.currentTimeMillis ());

Редактировать: Программа работает на VPS на основе Linux

11
задан casperOne 14 February 2013 в 12:55
поделиться

4 ответа

Во-первых, у вас небольшая опечатка, это 73 миллисекунды, а не секунды ( тогда это будет тревожно :-)).

Чтобы перейти к сути дела, вы должны знать, что Java является языком очень высокого уровня с доступом к системным функциям, предоставляемым вам только через нативные вызовы функций. Эти вызовы реализуются вашей виртуальной машиной, и их довольно много ( Sun, Open, Dalvik...), поэтому общих советов дать нельзя, но время возврата currentTimeMillis зависит от многих вещей, таких как Threading ( как в ВМ, так и в нативных потоках ), разрешение встроенного таймера и т.д. Я признаю, что результаты странные, но если вы не сильно зависите от их правильной последовательности, я бы не стал беспокоиться и просто жить с аномалией в диапазоне десятых долей секунды.

Если вам нужен более конкретный совет, пожалуйста, вставьте немного вашего исходного кода!

Edit:

После того, как я увидел ваш исходный код, я вполне уверен, что ваша функция Log использует какую-то приоритетную обработку или потоковую обработку, что приводит к ложным результатам. Просто попробуйте присвоить возвращаемое значение рассматриваемому методу и передать эту переменную в свой лог:

long foo = System.currentTimeMillis();
setLog(foo); 
0
ответ дан 3 December 2019 в 11:04
поделиться

System.currentTimeMillis() зависит от системных часов. Похоже, что системные часы были микрокорректированы внешней программой, для Linux это, вероятно, NTP.

Обратите внимание, что вы не должны использовать System.currentTimeMillis() для измерения истекшего времени. Лучше использовать System.nanoTime(), но даже это не гарантированно будет монотонным.

.
7
ответ дан 3 December 2019 в 11:04
поделиться

Однажды мы увидели подобную вещь, работающую на Ubuntu с микросхемами AMD64x2. Если у вас также есть чип, то я бы начал искать.

0
ответ дан 3 December 2019 в 11:04
поделиться

Метод, о котором идет речь, зависит от системных часов, и системные часы могут иметь проблемы. См. http://support.ntp.org/bin/view/Support/KnownOsIssues для обсуждения вопросов обеспечения точности системных часов с помощью демона ntpd(8).

Я также рекомендую http://www.vmware.com/pdf/vmware_timekeeping.pdf для обсуждения вопросов точности системных часов в VMWare. Так же отлично обсуждаются системные часы в целом

.
0
ответ дан 3 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

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