Ответ, помеченный правильно на этой странице, на самом деле не верен.Это недопустимый способ написания эталонного теста из-за устранения мертвого кода JVM (DCE), замены в стеке (OSR), развертывания цикла и т. Д. Только инфраструктура, подобная инфраструктуре микробанчмаркинга Oracle JMH, может правильно измерить нечто подобное.Прочитайте этот пост , если у вас есть какие-либо сомнения относительно достоверности таких микро-тестов.
Вот тест JMH для System.currentTimeMillis()
против System.nanoTime()
:
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Benchmark)
public class NanoBench {
@Benchmark
public long currentTimeMillis() {
return System.currentTimeMillis();
}
@Benchmark
public long nanoTime() {
return System.nanoTime();
}
}
И вот результаты (на Intel Core i5):
Benchmark Mode Samples Mean Mean err Units
c.z.h.b.NanoBench.currentTimeMillis avgt 16 122.976 1.748 ns/op
c.z.h.b.NanoBench.nanoTime avgt 16 117.948 3.075 ns/op
, который показывает, что System.nanoTime()
немного быстрее: ~ 118 нс за вызов по сравнению с ~ 123 нс.Тем не менее, также ясно, что, если принять во внимание среднюю ошибку, между ними будет очень мало различий.Результаты также могут отличаться в зависимости от операционной системы.Но общий вывод должен состоять в том, что они по существу эквивалентны с точки зрения накладных расходов.
ОБНОВЛЕНИЕ 2015/08/25: Хотя этот ответ ближе к исправлению этого большинства, используя JMH для измерения, он все еще не верен.Измерение чего-то вроде System.nanoTime()
само по себе является особым видом искаженного бенчмаркинга.Ответ и окончательная статья здесь .