在Java中计时代码执行的一种干净方法是什么?

Mar*_*ark 5 java timing autocloseable

时间代码执行可能很方便,所以您知道事情要花多长时间。但是,我发现这样做的一般方法很草率,因为它应该具有相同的缩进,这使得读取实际计时内容变得更加困难。

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));
Run Code Online (Sandbox Code Playgroud)

尝试

我提出以下内容,它看起来更好,但有一些优点和缺点:

好处:

  • 很明显,由于缩进,正在计时
  • 它会自动打印代码完成后花费多长时间

缺点:

  • 这不是AutoClosable应该使用的方式(很确定)
  • 它创建了一个TimeCode不好的新实例
  • try块内声明的变量不能在块外访问

可以这样使用:

 try (TimeCode t = new TimeCode()) {
     // The stuff you want to time
 }
Run Code Online (Sandbox Code Playgroud)

使之成为可能的代码是:

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

}
Run Code Online (Sandbox Code Playgroud)

问题

我的问题是:

  • 我的方法实际上是否像我认为的那样糟糕
  • 是否有更好的方法来计时Java中的代码执行,您可以清楚地看到正在计时的时间,还是只需要解决第一个代码块之类的问题。

Joo*_*gen 3

你的解决方案很好。

一种表达性较差的方法是将要计时的代码包装在 lambda 中。

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

timeCode(() -> { ...code to time... });
Run Code Online (Sandbox Code Playgroud)

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