Для базовой синхронизации вы можете использовать класс Stopwatch
класса Guava (или просто захватить его исходный код, если вы не хотите загружать всю библиотеку Guava).Для более полного решения сравнительного анализа посмотрите на Штангенциркуль той же командой.
Оба они основаны на System.nanoTime()
, который вы должны предпочитать более чем System.currentTimeMillis()
для измерения прошедшего времени.Основная причина в том, что System.currentTimeMillis()
- это «часы» (которые пытаются вернуть время на стене), тогда как System.nanoTime()
- это «таймер» (который пытается вернуть время с некоторой произвольной точки).
Вам нужны часы, когда вы пытаетесь выяснить, когда произошло одно событие, чтобы вы могли выстроить их в линию с вашими часами или часами на стене (или часами на другом компьютере).Но он не подходит для измерения прошедшего времени между двумя событиями в одной и той же системе, поскольку компьютер иногда корректирует свое представление о том, как его собственные внутренние часы соответствуют настенному времени.Например, если вы выполните
long timeA = System.currentTimeMillis();
doStuff();
long timeB = System.currentTimeMillis();
System.out.println("Elapsed time: " + (timeB - timeA));
, то можно получить отрицательный результат, если NTP отрегулирует в обратном направлении во время выполнения doStuff()
.System.nanoTime()
, будучи таймером, а не часами, должен игнорировать эту настройку, таким образом, избегая этой проблемы.
(Обратите внимание, что все вышеперечисленное является концептуальным; к сожалению, на уровне реализации все может запутаться. Но это неНе меняйте рекомендацию: System.nanoTime()
должен быть лучшим таймером, который вы можете получить на своей платформе, а System.currentMilliseconds()
должен быть лучшим, который вы можете получить.)