System.currentTimeMillis() не является точной в Windows XP?

#java #time

#java #время

Вопрос:

Кажется System.currentTimeMillis , это не очень точно.

Смотрите этот пример:

 public class MillisTime {
    public static void main(String[] args) {
        long start = 0;
        long end = 0;
        while (true) {
            if (start == 0) {
                start = System.currentTimeMillis();
            } else {
                long current = System.currentTimeMillis();
                if (current != start) {
                    end = current;
                    break;
                }
            }
        }
        System.out.println("The time interval of your OS: "   (end - start)   "ms");
    }
}
 

Результат (в Windows XP):

 The time interval of your OS: 15ms
 

Почему это не 1ms так? И как получить точную миллисекунду текущего времени?

Ответ №1:

Это вполне ожидаемо. Вы увидите то же самое при использовании DateTime.Now .NET. (См. Сообщение в блоге Эрика Липперта по этой теме для ориентированного на .NET представления по этой же теме.)

Вы можете использовать System.nanoTime() , чтобы получить более точный таймер только для измерений — он не предназначен для указания абсолютного времени, он предназначен только для измерения интервалов.

Я не знаю ни одного способа получить более точное абсолютное время ни из Java, ни из Win32. Честно говоря, насколько точными будут системные часы в любом случае? Даже при регулярной синхронизации с сервером NTP я ожидал бы неточности по крайней мере в несколько миллисекунд.

В принципе, если вы полагаетесь на получение действительно точного абсолютного времени, вам, вероятно, следует изменить свой дизайн.

Комментарии:

1. Почему в 2012 году невозможно получить точное время из Windows. Я регистрирую данные со временем ms, чтобы я мог видеть, сколько времени требуется для запуска. Мне нужно посмотреть, занимают ли некоторые вещи 2 мс против 7 мс, чтобы я мог выполнить настройку, но в Windows это совершенно невозможно. Кто-нибудь еще думает, что это безумие? (Я любитель unix, и у меня никогда раньше не было этой проблемы.)

2. @stu: Проще говоря, вы не должны использовать настенные часы в качестве секундомера. Настенные часы предназначены для хорошего представления текущего времени; они не предназначены для измерения небольших различий во времени. Это именно то, для чего nanoTime.

Ответ №2:

ДА. javadoc для System.currentTimeMillis() этого говорит:

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

Вы могли бы использовать System.nanoTime() , но обязательно прочитайте его javadoc, чтобы понять его ограничения.

Ответ №3:

Невозможно получить более точную информацию с помощью java в Windows.