■ はじめに
* System.currentTimeMillis() と System.nanoTime() があるのは知ってて、 時間単位が、ミリ秒 と ナノ秒 の違いだけかと思ったが、 それだけでなく、出力の計測の仕方が異なっていたので、 今回は、この2メソッドを掘り下げてみる。
■ System.currentTimeMillis()
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#currentTimeMillis--
* 時間単位 : ミリ秒
使用上の注意
* API仕様の戻り値の説明より 「ミリ秒で測定した、現在時刻と協定世界時のUTC 1970年1月1日深夜零時との差」なので 「【OSのシステム時刻】-【1970/01/01 00:00:00】」と理解 => 例えば、『システム起動中に、OSのシステム日付を変更する』と、 プログラムが意図しない挙動になる可能性があることに注意 => OSによって、計測単位、分解能が依存する (多くのOSでは、時間の粒度が10ミリ秒程度の単位で計測される)
■ System.nanoTime()
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#nanoTime--
* From Java v1.5 * 時間単位 : ナノ秒
使用上の注意
* 経過時間を測定するためだけに使用 * 「time1 < time0」ではなく「time1 - time0 < 0」で比較すべき (数値のオーバーフローが発生する可能性があるため) ~~~~~ long time0 = System.nanoTime(); ... long time1 = System.nanoTime(); ~~~~~
■ (個人的な)結論
* 実行前と実行後で差を取って実行時間を計測したい時(例えば、タイマー)には、 System.nanoTime() を使用した方がいい
■ 便利なクラス : java.util.concurrent.TimeUnit
* From Java v1.5 * toNanos() / toMillis() etc * long timeInNano = TimeUnit.MILLISECONDS.toNanos(20L); * long timeInMilli = TimeUnit.NANOSECONDS.toMillis(20_000_000L); * sleep() * TimeUnit.MILLISECONDS.sleep(20_000_000L);
参考文献
http://blog.mwsoft.jp/article/30375272.html
http://d.hatena.ne.jp/Nagise/20110221/1298301239
http://eng-entrance.com/java-get-time#SystemjavalangSystem
関連記事
日付・時間 について ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2014/11/18/235600
日付・時間 について ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2016/10/12/235711
日付・時間 について ~ Java8編 ~
https://dk521123.hatenablog.com/entry/2018/02/24/014650