web-dev-qa-db-ja.com

Javaプログラムを実行するのにかかる時間を見つける方法は?

Java作業中のアプリケーションがあり、プログラムは1分以内に値を返す必要があるが、プログラムの実行にかかった時間プログラムの実行にかかった時間を見つける方法

30
MK1

System.nanoTime()を使用して時間を比較できます。ナノ秒単位で時間を返します。

利用可能な最も正確なシステムタイマーの現在の値をナノ秒単位で返します。

次のように使用できます。

_long startTime = System.nanoTime();

// code

long endTime = System.nanoTime();
System.out.println("Took "+(endTime - startTime) + " ns"); 
_

便利なリンク:

74
Jigar Joshi

プログラムが実行されている時間を確認する組み込みの方法はありません。ただし、プログラムの開始時に現在の時刻を保存するだけでよいので、いつかは経過した時間を確認できます。

public class MyProgram {
    private static long startTime = System.currentTimeMillis();

    public static void main(String[] args) {
        // Do stuff...

        // At the end
        long endTime = System.currentTimeMillis();
        System.out.println("It took " + (endTime - startTime) + " milliseconds");
    }
}
13
Jesper

プロジェクトの依存関係としてSpringを使用している場合(または追加する必要はありません)、StopWatchを使用できます。名前が示すように、初期化されると、停止するまでの時間がカウントされます。その後、タスクにかかった時間を確認できます。複数のStopWatchesを複数のタスクに同時に使用して、コードをクリーンに保つことができます。

コードをきれいに保つことに加えて、StopWatchesは時間やその他のユーティリティメソッドのフォーマットを支援します。

public void myMethod(){
    StopWatch stopWatch = new StopWatch();

    stopWatch.start("Task1");
    // ...
    // Do my thing
    // ...
    stopWatch.stop();
    System.out.println("Task executed in " + stopWatch.getTotalTimeSeconds() + "s");
}
2
Felipe Leão

プログラムの実行時間を知りたい場合は、プログラムの最初と最後にSystem.currentTimeMillis()を使用します。

1
AlexR

Systemクラスが提供する2つのAPIを使用できます

  1. System.currentTimeMillis() コードがミリ秒の範囲で時間がかかる場合
  2. System.nanoTime() コードがナノ秒の範囲で時間がかかる場合

サンプルコード

public class TestTimeTaken {
    public static void main(String args[]) throws InterruptedException{
        long startTimeNanoSecond = System.nanoTime();
        long startTimeMilliSecond = System.currentTimeMillis();

        //code
        Thread.sleep(1000);
        //code

        long endTimeNanoSecond = System.nanoTime();
        long endTimeMilliSecond = System.currentTimeMillis();

        System.out.println("Time Taken in "+(endTimeNanoSecond - startTimeNanoSecond) + " ns");
        System.out.println("Time Taken in "+(endTimeMilliSecond - startTimeMilliSecond) + " ms");


    }
}
1
Om Prakash Sao

ライブラリを利用できる場合、Apache Commons StopWatchクラスを使用するのが好きです。

import org.Apache.commons.lang3.time.StopWatch;

// ...

StopWatch stopWatch = new StopWatch();
String message = "Task : %s (%s) seconds";

// ...

stopWatch.split();
System.out.println(String.format(message, "10", stopWatch.toSplitString()));

// ...

stopWatch.split();
System.out.println(String.format(message, "20", stopWatch.toSplitString()));

stopWatch.stop();

0
Gabriel Gates

これは、たとえば Spring AOP を使用するなど、アスペクトの典型的なユースケースです。

@Aspect
public class TimerAspect {

    private static final Logger LOG = Logger.getLogger(TimerAspect.class);

    @Around("com.xyz.myapp.MyClass.myMethod()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        long startTime = System.nanoTime();
        Object retVal = pjp.proceed();
        long endTime = System.nanoTime();
        LOG.info(String.format("Call to %s.%s with args %s took %s ns", pjp.getTarget(), pjp.getSignature(), Arrays.toString(pjp.getArgs()), endTime - startTime));
        return retVal;
    }
}

そして、アプリケーションのコンテキストで:

<aop:aspectj-autoproxy/>
<bean id="myAspect" class="org.xyz.TimerAspect"/>   
0
Adriaan Koster