2015-06-03 3 views
2

Я пытаюсь вычислить время, прошедшее в java, используя nanoTime. Но каждый раз это дает мне разные результаты. Почему это всегда непротиворечиво?непостоянное время, прошедшее в java

Пример кода:

long startTime=System.nanoTime(); 
String.valueOf(number).length(); 
long endTime = System.nanoTime(); 
System.out.println(endTime-startTime); 
+3

Обязательный комментарий; http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – Gosu

+1

Зачем вам это нужно, чтобы быть последовательным? – defectus

+2

Ну, потому что загрузка процессора и * состояние * не всегда одинаковы (каждый раз меняется). Как предлагает @Gosu, это неправильный способ сделать правильный микро-бенчмаркинг. – TheLostMind

ответ

2

отступников время будет меняться в зависимости от того, как JVM будет выполнять и распределять время обработки в потоке, в котором этот код выполняет. Я пробовал несколько прогонов и всегда получал результат в диапазоне от 9000 до 11000 наносекунд. Это выглядит довольно последовательным.

6

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?

Смежные вопросы