如何找出运行Java程序所花费的时间?

33

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


很抱歉,您的问题不够清晰。我认为Eclipse在这里是无关紧要的。运行时也是无关紧要的,因为它会让人感到困惑。JDK有一个名为Runtime的类,您可以通过调用Runtime.getRuntime()来获取其单例实例,但似乎这并不是您正在寻找的内容。请尝试重新思考并重写您的问题。 - AlexR
7个回答

80

您可以使用System.nanoTime()比较时间。它会返回纳秒级的时间。

返回可用的最精确系统计时器的当前值,以纳秒为单位。

您可以按照以下方式使用它:

long startTime = System.nanoTime();

// code

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

有用的链接:


15

没有内置的方法可以查看程序运行的时间长度。但是,你可以在程序开始时存储当前时间,然后在稍后的某个时候查看经过了多长时间。

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

3
如果您的项目已经依赖于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
您可以使用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
我喜欢在有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();


1
如果您只想知道程序运行的时间,请在程序开头和结尾使用System.currentTimeMillis()。

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"/>   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接