Я пытаюсь измерить продолжительность некоторого периода как с System.nanoTime()
, так и с System.currentTimeMillis()
. И чем дольше будет период, тем больше разница получается из двух измерений.nanoTime и currentTimeMillis имеют разную скорость на Mac OS
Вот небольшой фрагмент кода, демонстрирующий проблему:
public class TimeTest {
public static void main(String[] args) throws Exception {
long startNanos = System.nanoTime();
long startMillis = System.currentTimeMillis();
while (true) {
long nowNanos = System.nanoTime();
long nowMillis = System.currentTimeMillis();
System.out.println((nowMillis - startMillis) - (nowNanos - startNanos)/1000000);
Thread.sleep(100);
}
}
}
При работе на Mac OS с JDK 1.8.0_74 существует четкая тенденция, что уменьшение значений примерно 2 мс в минуту. То есть сначала я вижу только 0 и 1, но через 10 минут есть значения около -20.
мне удалось наблюдать такое поведение только на макинтош с jdk8, не мог воспроизвести его на Linux и на окнах и с JDK 7 и 8.
Итак, вопрос: кто лжет? Я знаю, что для измерения продолжительности следует использовать nanoTime()
. Но в этом случае я не уверен, что это правда.
Может кто-нибудь уточнить эту тему?
Я вижу аналогичную вещь, происходящую на Windows 7 x64 с Java 8. – resueman