我有一个Java应用程序正在进行开发,我刚刚意识到该程序必须在不到一分钟内返回一个值,但是不知道如何查找或显示运行程序所需的时间。如何找到运行程序所需的时间?
您可以使用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");
}
}
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
类提供的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");
}
}
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"/>