Система метод.currentTimeMillis() действительно возвращает текущее время?
на основе идей, представленных в ссылке я реализовал несколько различных "методов сна". Одним из таких методов был "бинарный сон", который выглядит так:
while (System.currentTimeMillis() < nextTimeStamp)
{
sleepTime -= (sleepTime / 2);
sleep(sleepTime);
}
поскольку проверка, если следующий шаг времени уже достигнут, происходит в начале I, ожидалось бы, что метод работает слишком долго. Но кумулятивное распределение ошибки моделирования (ожидаемое время - Реальное время) выглядит следующим образом:alt-текст http://img267.imageshack.us/img267/4224/errorvscummulativearran.jpg
есть ли у кого-нибудь идея, почему я получаю эти результаты? Может быть, система методов.currentTimeMillis() не возвращает текущее время?
BR,
Маркус
@irreputable
когда я сделал оценку, я также создал кривую колокола, используя немецкую статистическую программу. Поскольку изменить заголовок не удалось, вот перевод на английский язык из всех соответствующих пунктов:
Häufigkeit = частота
Fehler = ошибка
средняя примерно = средняя
Std-Abw = стандартное отклонение
alt текст http://img694.imageshack.us/img694/2254/bellcurve.jpg
3 ответов
нет это не так. Ее младший брат!--3-->System#nanoTime()
гораздо лучше точность чем System#currentTimeMillis()
.
помимо ответов в их Javadocs (нажмите на ссылки здесь выше), эта тема также обсуждалась несколько раз здесь. Сделайте поиск на "currenttimemillis vs nanotime" и вы попадете под каждую эту тему:
в документах,
* 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.
то, что вы видите, является базовым разрешением часов до 15 мс. Это особенность скорости OS & interrupt. Существует патч для ядра linux, чтобы увеличить это разрешение до 1 мс, я не уверен в windows. Было несколько посты об этом уже.