nanoTime()
и его сестра currentTimeMillis()
не точны и в зависимости от архитектуры запустить свой код на них страдают от округления (см javadoc подробности):
This method provides nanosecond precision, but not necessarily nanosecond resolution
(that is, how frequently the value changes) -
no guarantees are made except that the resolution is at least as good
as that of currentTimeMillis().
Если измерить время для того, чтобы решить, если альтернатива a или b быстрее, вы в основном делаете микро-тест. Для этого есть рамки, и вы должны их использовать. Вероятно, наиболее известным для Java является JMH. Если вам нужно сделать то же самое для более крупных частей кода, вы можете рассмотреть профилирование.
Вы можете посмотреть на этой StackOverflow сообщение: How do I write a correct micro-benchmark in Java?
Обязательный комментарий; http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – Gosu
Зачем вам это нужно, чтобы быть последовательным? – defectus
Ну, потому что загрузка процессора и * состояние * не всегда одинаковы (каждый раз меняется). Как предлагает @Gosu, это неправильный способ сделать правильный микро-бенчмаркинг. – TheLostMind