La respuesta correcta en esta página no es correcta. Esa no es una forma válida de escribir un punto de referencia debido a la eliminación de código muerto (DCE) de JVM, reemplazo en la pila (OSR), desenrollado de bucles, etc. Solo un marco como el marco de micro-benchmarking JMH de Oracle puede medir algo así. Lea this post si tiene alguna duda sobre la validez de dichos micro benchmarks.
Aquí es un punto de referencia JMH para System.currentTimeMillis()
vs 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();
}
}
Y aquí están los resultados (en un procesador 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
lo que demuestra que System.nanoTime()
es ligeramente más rápido en ~ 118ns por invocación en comparación con ~ 123ns. Sin embargo, también está claro que una vez que se tiene en cuenta el error medio, hay muy poca diferencia entre los dos. Los resultados también pueden variar según el sistema operativo. Pero la conclusión general debería ser que son esencialmente equivalentes en términos de sobrecarga.
ACTUALIZACIÓN 2015/08/25: Si bien esta respuesta está más cerca de corregir la mayoría, utilizando JMH para medir, todavía no es correcta. Medir algo como System.nanoTime()
en sí mismo es un tipo especial de benchmarking retorcido. La respuesta y el artículo definitivo es here.
Tenga en cuenta que 'nanoTime' no se correlaciona con el tiempo real y solo debe usarse para medir cuánto tiempo tomó algo. – Powerlord
@ R.Bemrose, gracias, lo sé. Es realmente para medir cuánto tiempo lleva algo. –