在这个页面上标记正确的答案其实是不正确的。这不是写一个基准的有效方法,因为JVM死代码消除(DCE),堆栈替换(OSR),循环展开等。只有像Oracle的JMH微基准框架这样的框架可以正确地测量这样的东西。如果您对这些微基准测试的有效性有任何疑问,请阅读
this post。
这里是一个JMH基准为System.currentTimeMillis()vs System.nanoTime():
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Benchmark)
public class NanoBench {
@GenerateMicroBenchmark
public long currentTimeMillis() {
return System.currentTimeMillis();
}
@GenerateMicroBenchmark
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()稍微更快,在〜118ns每次调用相比〜123ns。然而,也清楚的是,一旦考虑到平均误差,两者之间存在非常小的差异。结果也可能因操作系统而异。但是总的来说应该是它们在开销方面基本上是等价的。
UPDATE 2015/08/25:虽然这个答案更接近正确,最多,使用JMH来衡量,它仍然不正确。测量类似System.nanoTime()本身是一种特殊的扭曲基准。答案和最后文章是here。