Javaプログラムの実行時間統計

2503 ワード

コードを書く時、特に時間に対する要求が高い仕事を完成する時、私達はよく統計プログラムの実行時間が必要です。全体の考え方はもちろん簡単です。プログラムの起動と終了後にそれぞれ現在の時間を記録します。両者は減量して、プログラムの運行時間を得ました。いくつかの一般的な方法を紹介します。具体的な利用状況はプロジェクトの必要に応じて選択できます。
一、簡単な方法
1.1 System.current TimeMillis()
皆さんの第一印象はきっとSystem.current TimeMillisです。そうですこれは一番簡単な時間統計に使うことができます。
long start = System.currentTimeMillis();
//       ...
long end = System.currentTimeMillis();
long timeElapsed = finish - end; //      
System.current TimeMillis()はシステムの現在時刻(Wall-clock Time)から1970-1-1 00:00の経過時間であり、単位はミリ秒であることを記録している。システムの現在の時間は具体的にどういう意味ですか?current TimeMillis()は正確に1 msまでではなく、オペレーティングシステムの具体的な実現に関連しています。この方法を使うと問題があります。システムの時間はいつでも調節できます。たとえば:
  • ユーザが手動でシステム時間を調整する。
  • システムは時間サーバによって自動的に時間を調節する。
  • 冬時間、夏時間がある地域は自動的に時間を調節します。
  • 閏秒(Leap seconds)は、この閏秒は多くのシステムが切断されています。
  • この方法は開発段階では時間をざっと見積もっても大丈夫ですが、生産環境を使うと大きなリスクがあります。
    1.2 System.nanoTime()
    nanoTime()は、current TimeMillis()とは正反対で、システム時間とは全く関係なく、目的もプログラムの時間消費を統計するために用いられている。nanoTime()に記録されているのは、ある一定の時刻から、今までどれぐらいのナノ秒が経過していますか?しかし、この固定時刻はUnixタイムスタンプの1970-1-1 00:00ではなく、仮想マシンを起動する際に生成される固定時刻であり、仮想マシンの生成時間はそれぞれ異なる。
    nanoTime()はナノ秒まで正確ですが、ナノ秒ごとに一つの型を打っているのではなく、3ナノ秒後に一気に3コマ打つ可能性があります。しかし、少なくともcurrent TimeMillis()と同じように正確であることが保証される。
    nanoTime()を使用する統計方法は、current TimeMillis()と同じで、以下の通りである。
    long start = System.nonoTime();
    //       ...
    long end = System.nonoTime();
    long timeElapsed = finish - end; //      
    二、Java 8以上
    Java 8以上は新しい万年暦を定義しています。Java epochに基づいて、一日を正確に86400秒に分けます。新しいインスタグを使う方法は以下の通りです。
    Instant start = Instant.now();
    //       ...
    Instant end = Instant.now();
    long timeElapsed = Duration.between(start, finish).toMillis(); //      
    三、第三方倉庫StopWatch
    StopWatchはAppche Commons Langライブラリの一部です。便利に時間を計ることができます。
    まずmavenライブラリを追加します。
    
        org.apache.commons
        commons-lang3
        3.7
    
    そしてコードの中:
    StopWatch watch = new StopWatch();
    watch.start();
    //       ...
    watch.stop();
    System.out.println("Time Elapsed: " + watch.getTime() + "ms"); //      
    参考:
  • https://www.baeldung.com/java-measure-elapsed-time
  • https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#nanoTime
  • https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html
  • https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/StopWatch.html