2017-02-28 3 views
1

私は、javaコード内のコードブロックが占める時間をログするユーティリティメソッドを用意しようとしています。Java - 有効期間をログするユーティリティメソッド

public static void logDuration(Runnable blockToExec 
      , String blockCode) { 
    Instant start = Instant.now(); 
    blockToExec.run(); 
    Duration duration = Duration.between(start, Instant.now()); 

    /* 
     SAMPLE OUPUT of below print stmt (from JAVA API doc) 
     "20.345 seconds"     -- "PT20.345S 
     "15 minutes" (15 * 60 seconds) -- "PT15M" 
     "10 hours" (10 * 3600 seconds) -- "PT10H" 
     "2 days" (2 * 86400 seconds)  -- "PT48H" 
    */   
    System.out.println("Time taken to complete <" + blockCode + "> - " + duration.toString()); 
} 

メインコード:

Utils.logDuration(() -> { 

    List<PersonInfo> personInfos = persons.stream() 
      .flatMap(person -> person.getCurrAndPrevAddrs().stream() 
        .map(addr -> { 
         PersonInfo personInfo = new PersonInfo(); 
         personInfo.setName(person.getName()); 
         personInfo.setAge(person.getAge()); 
         personInfo.setAddrs(addr);    
         return personInfo; 
        } 
      )).collect(Collectors.toList()); 

}, "Parsing and Splitting Persons list"); 

サンプルの出力、期間およびユーティリティメソッドを使用してメインコードをログに記録するためのユーティリティコードの下に

ユーティリティコードを見つけてください: パーシングと分割のユーザーリストを完了するまでにかかる時間 - PT0.012S

これは正常に動作しているようですが、この実装がコード実行に悪影響を与えることはありません。この実装の設計上の欠陥を教えてください。または、代替実装がある場合は、私に知らせてください。

+0

[CodeReview](http://codereview.stackexchange.com/)この種の質問のための最良のStackExchangeになります:) – Aaron

+1

System.nanoTimeを使用してください。もちろん、Runnableインスタンスを作成すること、そして何よりもコンソールに出力することで、コードが遅くなります。コード内のホットスポットに時間を置くと、それが重要になる可能性があります。あなたの設計におけるもう一つの問題は、何かを後退させたり、チェック例外をスローする必要がある何かを時間切れにすることができないことです。 –

答えて

0

なぜコードの実行時間を記録しますか?代わりにボトルネックを見つけるために、JProfilerのようなプロファイラを使用したいと思います。とにかく、時間を測定する必要がある場合は、DropWizard Metricsを使用して、これらのメトリックをJMXなどで公開することができます。

実行時間を出力するログファイルを読み込む方が便利です。

0

JMHなどのマイクロベンチマーキングフレームワークを見てください。JMHは、JVMをターゲットとするJavaやその他の言語で作成されたナノ/マイクロ/ミリ/マクロベンチマークの構築、実行、分析のためのJavaハーネスです。

1

あなたはグアバがありストップウォッチユーティリティ、したいように聞こえる:

Stopwatch watch = Stopwatch.createStarted(); 
// your code 
long elapsed = watch.elapsed(TimeUnit.MILLISECONDS); 

をあなたはベンチマークあなたのコードにしたい場合を除きます。それはマイクロベンチマークです。この場合、JMHはそのための事実上のツールです。続きを読むhere

関連する問題