web-dev-qa-db-ja.com

Javaで関数が完了するまでにかかる時間をカウントするにはどうすればよいですか?

Javaで関数が完了するまでにかかる時間を測定する必要があります。どうやってやるの?

注意:

functionの時間消費を測定したいのですが、完全なプログラムの時間消費ではありません。

50
fmsf
long start = System.nanoTime();    
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;
88
Ande TURNER

経過時間を計算する方法は次のとおりです。

// Get current time
long start = System.currentTimeMillis();

// Do something ...

// Get elapsed time in milliseconds
long elapsedTimeMillis = System.currentTimeMillis()-start;

// Get elapsed time in seconds
float elapsedTimeSec = elapsedTimeMillis/1000F;

// Get elapsed time in minutes
float elapsedTimeMin = elapsedTimeMillis/(60*1000F);

// Get elapsed time in hours
float elapsedTimeHour = elapsedTimeMillis/(60*60*1000F);

// Get elapsed time in days
float elapsedTimeDay = elapsedTimeMillis/(24*60*60*1000F);
8
Aaron Maenpaa

グアバを使用している場合は、 Stopwatch の使用を検討してください。例:

final Stopwatch sw = Stopwatch.createStarted();
methodToBeTimed();
final long elapsedMillis = sw.elapsed(TimeUnit.MILLISECONDS);
7
Jonathan

プロファイラーは、複数の機能がある場合の正しい答えです。

これまでに示したすべての提案で見られる別の問題は、それらが単一の関数で正常に動作することですが、コードには、オフにできないタイミングのものが散らばっていることです。

アスペクト指向プログラミングを行う方法を知っている場合、タイミングコードを1か所に保持し、宣言的に適用するのに良い方法です。 Log4Jのようなものを使用して値を出力する場合、それをオフまたはオンにするオプションがあります。それは貧乏人のプロファイラーです。

AspectJまたはSpringのAOPをご覧ください。

6
duffymo

上記のすべてのコードスニペットは、メソッドが呼び出されてからメソッドが例外を返す/スローするまでのおよその経過時間を測定します。このような手法は、スレッドのスケジューリング、GCによる一時停止などには対応していません。

はい、一部のプロファイラーは合理的な仕事をします。

Java 1.6以降を使用している場合、JMXベースのVM管理および監視サポートを使用できます。たとえば、 ThreadMXBean。 getCurrentThreadCpuTime() of value。メソッドの呼び出しの前後にこの値の差を計算すると、次の結果が得られます。

"...現在のスレッドのナノ秒単位の合計CPU時間。戻り値はナノ秒の精度ですが、必ずしもナノ秒の精度ではありません。実装でユーザーモード時間とシステムモード時間を区別する場合、返されるCPU時間は時間です現在のスレッドがユーザーモードまたはシステムモードで実行されたこと。」

メソッドがワーカースレッドから生成される場合、計算はさらに複雑になる必要があります;-)

一般的には、 Java.lang.mangement パッケージを回避することをお勧めします。

5
Dilum Ranatunga

System.nanoTime は、マイクロベンチマークの2つの時間の間のデルタを正確に測定するために使用する必要があります。

public class CountTime {

  private static void walk() {
    for (int i = 0; i < Integer.MAX_VALUE; i++)
      ;
  }

  public static void main(String[] args) {
    long t0 = System.nanoTime();
    walk();
    long t1 = System.nanoTime();
    System.out.println("Elapsed time =" + (t1 - t0)
        + " nanoseconds");
  }

}

System.currentTimeMillis は、現在の時刻をミリ秒単位で返します。これを使用して現在の時刻を取得できます。これは、古いVMや長時間実行されるプロセスで役立つ場合があります。

4
McDowell

System.currentTimeMillis()またはSystem.nanoTime()のいずれかを使用します。

int someMethod() {
    long tm = System.nanoTime();
    try {
        ...
    } finally {
        tm = System.nanoTime()-tm;
        System.out.println("time spent in someMethod(): " + tm + "ns");
    }
}
3
Maurice Perry

このアナログストップウォッチは私たちにとっても別のオプションです... Java2s.comはこちら

0
gumuruh