動機
JavaのSystem.currentTimeMillis()
の説明*1には以下のように書いてあるけど本当? System.currentTimeMillis()
とSystem.nanoTime()
で試してみた。
たとえば、多くのオペレーティング・システムでは、時間を10ミリ秒の単位で計測します。
方法
以下のプログラムを実行した結果を確認した。OSやVMごとの違いなどもあるかもしれないので、JDK 8/11/17それぞれについて、Windows上・WSL2上のものと、オンラインIDEの結果を取得した。
public static void main(String args[]) { System.out.println(System.getProperty("os.name")); System.out.println(System.getProperty("java.vm.name")); System.out.println(System.getProperty("java.vendor")); System.out.println(System.getProperty("java.version")); for (int i=0; i<100; i++) { System.out.println(String.format("%19d", System.currentTimeMillis())); } for (int i=0; i<100; i++) { System.out.println(String.format("%19d", System.nanoTime())); } }
結果
https://docs.google.com/spreadsheets/d/189di6xCjxbALEpCVxdQS8cIA9OXWpjCacx2O3lwKJJo/edit?usp=sharing
考察
- 「10ミリ秒の単位で計測」とのことだが、どの環境でも
System.currentTimeMillis()
の数値自体は1ミリ秒単位の粒度で取得できている。 System.nanoTime()
の方はOSによって傾向に差が出ている。- どのケースも
System.currentTimeMillis()
はループの1回目だけ間隔が広いのは最適化のせいなのかな。でも、System.nanoTime()
の方はそんなことないんだよなぁ……