首页 > 解决方案 > 什么是在 Java 中计时代码执行的干净方法?

问题描述

它可以很方便地为代码执行计时,这样您就知道需要多长时间。但是,我发现这是草率完成的常见方式,因为它应该具有相同的缩进,这使得阅读实际计时的内容变得更加困难。

long start = System.nanoTime();

// The code you want to time

long end = System.nanoTime();
System.out.printf("That took: %d ms.%n", TimeUnit.NANOSECONDS.toMillis(end - start));

一次尝试

我想出了以下,它看起来好多了,有一些优点和缺点:

好处:

缺点:

它可以这样使用:

 try (TimeCode t = new TimeCode()) {
     // The stuff you want to time
 }

使这成为可能的代码是:

class TimeCode implements AutoCloseable {

    private long startTime;

    public TimeCode() {
        this.startTime = System.nanoTime();
    }

    @Override
    public void close() throws Exception {
        long endTime = System.nanoTime();
        System.out.printf("That took: %d ms%n",
                TimeUnit.NANOSECONDS.toMillis(endTime - this.startTime));
    }

}

问题

我的问题是:

标签: javatimingautocloseable

解决方案


你的解决方案很好。

一种表达较少的方法是将代码包装在 lambda 中进行计时。

public void timeCode(Runnable code) {
    ...
    try {
        code.run();
    } catch ...
    }
    ...
}

timeCode(() -> { ...code to time... });

您可能希望捕获已检查的异常并将它们传递给某个运行时异常或其他什么。


推荐阅读