2009-08-06 8 views
21

タイミングを取るために、System.nanoTime()ペアにラップ・コードが頻繁に入ります。次のようなものがあります。Javaパフォーマンス・タイミング・ライブラリ

long start = System.nanoTime();  
methodToBeTimed(); 
long elapsedTime = System.nanoTime() - start; 

この問題の原因となるタイミングライブラリはありますか?自家製のコードも受け入れます。

私は私のユニットテストでは、いくつかの時間の制約を強制するため、NB

はプロファイラは、ここでの解決策ではありませんので、私はタイミング法プログラムでにしたいです。

+0

「問題」があなたが解決しようとしていることは何か分かりません。一番上には1行、一番下にはもう一つの行があり、経過時間を与えます。そして、それを保持する変数が1つあります。これをクラスでラップするか、Stopwatchクラスを使用することができますが、コードの複雑さを実質的に減らすことはできません。上に1行、下に1行必要です。そのようなタイミングの記録と追跡を手助けしたいと思っていますか? – AgilePro

答えて

11

私はそれを使用しませんでしたが、私は最近perf4jに出くわしました。

+0

@マーク:聞いたことがありません。どうもありがとう! – dfa

+0

統合されたサーブレットを使用して、perf4jでグラフを描画することさえできます。それはかなりいいです。 – unludo

+0

perf4jがgithubに移動しましたhttps://github.com/perf4j/perf4j – Sebastien

8

ないあなたの質問に直接答えが、私はまた、多くの場合、私のコードを時間を計るために、このチップを用いて、ちょうど次のような単純なEclipseを書いています - >サラウンドテンプレートに:

long startTime = System.currentTimeMillis(); 
${line_selection}${cursor} 
long totalTime = System.currentTimeMillis() - startTime; 
System.out.println("Total time = " + totalTime); 
System.out.println(); 
+0

残念ながら私はnetbeansユーザーです - :) – dfa

1

JPerfをしようとしましたか?

+0

googleキャッシュを使用して使用方法を確認してください。または、xjperfへのリンクを確認してください:http://code.google.com/p/xjperf/ – techzen

+0

iperfのフロントエンドのようです"TCPとUDPの最大帯域幅性能を測定するための最新の代替手段"です。そうですか? – dfa

1

この問題を解決するにはどうすればよいですか?あなたには基本があります。経過時間はナノ秒単位で取得できます。基礎となるOS /ハードウェアが可能な解像度に正確になります。

また、あなたはプロファイラーがいないと知っています...しかし、私はYourKitで傑出した経験を持っています。外部からプロファイリングを制御するために使用できるAPIを提供します。あなたの正確な問題が何であるかに応じて、これを見て価値があるかもしれません。

6

コモンズランからStopWatchがあります。また、タイマーを分割することもできます。

+0

これは見た目はいいですが、System.nanoTime/System.currentTimeMillisのみをカプセル化して、 – dfa

+0

をデフォルトのバージョンより常に使いやすくしています; – IAdapter

+0

linkk broken ... – Pacerier

8

JUnit 4にはタイミング制約機能が組み込まれています。

@Test(タイムアウト= X)

トリックを行う必要があります。 Xは、メソッドの実行が許可される最大のミリ秒数です。

+0

私は勝者のようです。 –

+0

はい、これは非常に基本的な実装です。私は@Test(timeout = X、repeat = N)を覚えていますし、平均を表示します。 – dfa

3

あなたがSpringを使用している場合、クラスパスにStopWatchという名前の素晴らしいクラスが既にあります。

1

JETMはこれを実行するための優れたライブラリです。最小値、最大値、平均値を提供したり、有益なグラフを生成することもできます。

0

手作り...

import static java.lang.System.nanoTime; 

/** 
* For testing/debug purposes. 
* 
* <pre> 
* private Stopwatch stopwatch = new Stopwatch(); 
* ... 
* public void method1() { 
*  stopwatch.reset(); 
*  for (...) { 
*   ... 
*   stopwatch.start(); 
*   operation1(); 
*   stopwatch.stop(); 
*   ... 
*  } 
*  System.out.println("operation 1 max timing is " + stopwatch.getMaxLapTime()); 
* } 
* ... 
* public void method2() { 
*  stopwatch.reset(); 
*  for (...) { 
*   ... 
*   stopwatch.start(); 
*   operation2(); 
*   stopwatch.stop(); 
*   ... 
*  } 
*  System.out.println("operation 2 max timing is " + stopwatch.getMaxLapTime()); 
* } 
* </pre> 
* 
* @author Mykhaylo Adamovych 
*/ 
public class Stopwatch { 
    protected long totalTime; 
    protected long maxLapTime; 
    protected long minLapTime = Long.MAX_VALUE; 
    protected long lapsCount; 
    protected long lastThreshold; 

    /** 
    * Human readable time in seconds 
    * 
    * @param nanoTime 
    * @return time in seconds 
    */ 
    public static final String toSeconds(long nanoTime) { 
     return String.format("%.9f", nanoTime/1000000000.0); 
    } 

    public long getAverageLapTime() { 
     if (lapsCount == 0) 
      return 0; 
     return totalTime/lapsCount; 
    } 

    public long getMaxLapTime() { 
     return maxLapTime; 
    } 

    public long getMinLapTime() { 
     return minLapTime; 
    } 

    public long getTotalTime() { 
     return totalTime; 
    } 

    /** 
    * Returns last lap time, process statistic. 
    */ 
    public long lapTime() { 
     return processLapTime(); 
    } 

    private long processLapTime() { 
     if (lastThreshold == 0) 
      throw new IllegalStateException("Stopwatch is stopped."); 
     final long now = nanoTime(); 
     final long lapTime = now - lastThreshold; 
     lapsCount++; 
     totalTime += lapTime; 
     if (lapTime > maxLapTime) 
      maxLapTime = lapTime; 
     if (lapTime < minLapTime) 
      minLapTime = lapTime; 
     lastThreshold = nanoTime(); 
     return lapTime; 
    } 

    /** 
    * Resets statistic and starts. 
    */ 
    public void reset() { 
     totalTime = 0; 
     maxLapTime = 0; 
     minLapTime = Long.MAX_VALUE; 
     lapsCount = 0; 
     start(); 
    } 

    /** 
    * Starts time watching. 
    */ 
    public void start() { 
     lastThreshold = nanoTime(); 
    } 

    /** 
    * Suspends time watching, returns last lap time. 
    */ 
    public long stop() { 
     final long lapTime = processLapTime(); 
     lastThreshold = 0; 
     return lapTime; 
    } 
} 
+1

最小の可能な値で初期化されているため、あなたの実装が「minLapTime」とは思えません:0。 'Long.MAX_VALUE'にリセットされます)。 – martin

0

新しいものはJMHです。それはopenjdkプロジェクトの傘の下に作られています。

0

私はちょうどJava Simon(以前のon Google Code)の使用を開始しました。それは素晴らしいようです!依存性の少ないストップウォッチとカウンターの簡単なセット。

関連する問題