Я сделал небольшую программу для тестирования 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
Во-первых, у вас небольшая опечатка, это 73 миллисекунды, а не секунды ( тогда это будет тревожно :-)).
Чтобы перейти к сути дела, вы должны знать, что Java является языком очень высокого уровня с доступом к системным функциям, предоставляемым вам только через нативные вызовы функций. Эти вызовы реализуются вашей виртуальной машиной, и их довольно много ( Sun, Open, Dalvik...), поэтому общих советов дать нельзя, но время возврата currentTimeMillis зависит от многих вещей, таких как Threading ( как в ВМ, так и в нативных потоках ), разрешение встроенного таймера и т.д. Я признаю, что результаты странные, но если вы не сильно зависите от их правильной последовательности, я бы не стал беспокоиться и просто жить с аномалией в диапазоне десятых долей секунды.
Если вам нужен более конкретный совет, пожалуйста, вставьте немного вашего исходного кода!
Edit:
После того, как я увидел ваш исходный код, я вполне уверен, что ваша функция Log использует какую-то приоритетную обработку или потоковую обработку, что приводит к ложным результатам. Просто попробуйте присвоить возвращаемое значение рассматриваемому методу и передать эту переменную в свой лог:
long foo = System.currentTimeMillis();
setLog(foo);
System.currentTimeMillis()
зависит от системных часов. Похоже, что системные часы были микрокорректированы внешней программой, для Linux это, вероятно, NTP.
Обратите внимание, что вы не должны использовать System.currentTimeMillis()
для измерения истекшего времени. Лучше использовать System.nanoTime()
, но даже это не гарантированно будет монотонным.
Однажды мы увидели подобную вещь, работающую на Ubuntu с микросхемами AMD64x2. Если у вас также есть чип, то я бы начал искать.
Метод, о котором идет речь, зависит от системных часов, и системные часы могут иметь проблемы. См. http://support.ntp.org/bin/view/Support/KnownOsIssues для обсуждения вопросов обеспечения точности системных часов с помощью демона ntpd(8).
Я также рекомендую http://www.vmware.com/pdf/vmware_timekeeping.pdf для обсуждения вопросов точности системных часов в VMWare. Так же отлично обсуждаются системные часы в целом
.