我有一个我一直在研究的Java应用程序,我刚刚意识到该程序必须在不到一分钟内返回一个值,但不知道如何查找或显示运行该程序所需的时间。如何找到运行程序的时间?
答案 0 :(得分:73)
您可以使用System.nanoTime()
比较时间。它将以纳秒为单位返回时间。
返回最精确的可用系统计时器的当前值,以纳秒为单位。
您可以像这样使用它:
long startTime = System.nanoTime();
// code
long endTime = System.nanoTime();
System.out.println("Took "+(endTime - startTime) + " ns");
有用的链接:
答案 1 :(得分:13)
没有内置方法可以查看程序运行的时间。但是,您可以在程序开始时只存储当前时间,以便稍后您可以看到已经过了多长时间。
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");
}
}
答案 2 :(得分:2)
如果您将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");
}
答案 3 :(得分:1)
如果您只是想知道程序运行多长时间,请在程序的开头和结尾使用System.currentTimeMillis()。
答案 4 :(得分:1)
您可以使用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");
}
}
答案 5 :(得分:0)
这是方面的典型用例,例如使用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"/>
答案 6 :(得分:0)
当库可用时,我喜欢使用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();