このページで正解とマークされている答えは、実際には正しくありません。これは、JVM デッド コード除去 (DCE)、オンスタック置換 (OSR)、ループ アンローリングなどのため、ベンチマークを作成する有効な方法ではありません。Oracle の JMH マイクロ ベンチマーク フレームワークのようなフレームワークだけが、そのようなものを適切に測定できます。このようなマイクロ ベンチマークの有効性について疑問がある場合は、この投稿をお読みください。
System.currentTimeMillis()
vsの JMH ベンチマークは次の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()
これは、呼び出しごとに ~123ns と比較して ~118ns とわずかに高速であることを示しています。ただし、平均誤差を考慮に入れると、両者の間にほとんど差がないことも明らかです。また、結果はオペレーティング システムによって異なる可能性があります。しかし、一般的な要点は、オーバーヘッドに関しては本質的に同等であるということです。
UPDATE 2015/08/25: この回答は最も正確に近いですが、JMH を使用して測定しても、まだ正しくありません。それ自体のようなものを測定することSystem.nanoTime()
は、特別な種類のねじれたベンチマークです。答えと決定的な記事はこちらです。