如何找到运行Java程序的时间?

时间:2011-07-11 06:25:27

标签: java eclipse runtime

我有一个我一直在研究的Java应用程序,我刚刚意识到该程序必须在不到一分钟内返回一个值,但不知道如何查找或显示运行该程序所需的时间。如何找到运行程序的时间?

7 个答案:

答案 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

  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");


    }
}

答案 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();