Java作業中のアプリケーションがあり、プログラムは1分以内に値を返す必要があるが、プログラムの実行にかかった時間プログラムの実行にかかった時間を見つける方法
System.nanoTime()
を使用して時間を比較できます。ナノ秒単位で時間を返します。
利用可能な最も正確なシステムタイマーの現在の値をナノ秒単位で返します。
次のように使用できます。
_long startTime = System.nanoTime();
// code
long endTime = System.nanoTime();
System.out.println("Took "+(endTime - startTime) + " ns");
_
便利なリンク:
プログラムが実行されている時間を確認する組み込みの方法はありません。ただし、プログラムの開始時に現在の時刻を保存するだけでよいので、いつかは経過した時間を確認できます。
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");
}
}
プロジェクトの依存関係として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");
}
プログラムの実行時間を知りたい場合は、プログラムの最初と最後にSystem.currentTimeMillis()を使用します。
System
クラスが提供する2つのAPIを使用できます
サンプルコード
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");
}
}
ライブラリを利用できる場合、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();
これは、たとえば 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"/>