Действительно ли метод System.currentTimeMillis () возвращает текущее время? - PullRequest
6 голосов
/ 14 декабря 2009

Основываясь на идеях, представленных в ссылка Я реализовал несколько различных "методов сна". Одним из таких методов был «бинарный сон», который выглядит так:

while (System.currentTimeMillis() < nextTimeStamp)
{
sleepTime -= (sleepTime / 2);
sleep(sleepTime);
}

Поскольку проверка того, достигнут ли следующий шаг времени, происходит в начале I, можно ожидать, что метод выполняется слишком долго. Но совокупное распределение ошибки симуляции (ожидаемое время - реальное время) выглядит следующим образом: альтернативный текст http://img267.imageshack.us/img267/4224/errorvscummulativearran.jpg

У кого-нибудь есть идея, почему я получаю такие результаты? Может быть, метод System.currentTimeMillis () действительно не возвращает текущее время?

BR

Markus

@ неопровержимый

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

Häufigkeit = частота

Fehler = ошибка

Mittelwert = средний

Стандартное отклонение = стандартное отклонение

альтернативный текст http://img694.imageshack.us/img694/2254/bellcurve.jpg

Ответы [ 3 ]

10 голосов
/ 14 декабря 2009

Нет, это не так. Его младший брат System#nanoTime() имеет гораздо лучшую точность , чем System#currentTimeMillis().

Помимо ответов в их Javadocs (нажмите на ссылки здесь выше), эта тема также обсуждалась здесь несколько раз. Выполните поиск по "currenttimemillis vs nanotime" , и вы увидите по каждой теме: System.currentTimeMillis vs System.nanoTime .

2 голосов
/ 15 декабря 2009

То, что вы видите, это базовые часы, которые разрешаются с разрешением 15 мс. Это особенность ОС и частота прерываний. Есть патч для ядра Linux, чтобы увеличить это разрешение до 1 мс, я не уверен насчет windows. Об этом уже было сообщений .

2 голосов
/ 14 декабря 2009

По документам,

 * Returns the current time in milliseconds.  Note that
 * while the unit of time of the return value is a millisecond,
 * the granularity of the value depends on the underlying
 * operating system and may be larger.  For example, many
 * operating systems measure time in units of tens of
 * milliseconds.
...