计时代码执行可以很方便地了解事情需要多长时间。然而,我发现通常这样做的方式很草率,因为它应该具有相同的缩进,这使得更难以阅读实际计时的内容。
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));
一次尝试
我想到了以下方法,它看起来更好,有几个优点和缺点:
优点:
- 由于缩进,很清楚正在计时的内容
- 代码完成后,它将自动打印出花费的时间
缺点:
- 这不是使用
AutoClosable
的正确方式(相当确定) - 它创建了一个新的
TimeCode
实例,这不好 - 在
try
块中声明的变量无法在其外部访问
可以像这样使用:
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));
}
}
问题
我的问题是:
- 我的方法是否真的像我想象中的那样糟糕?
- 在Java中,有没有更好的计时代码执行的方法,可以清楚地看到正在计时的内容,或者我只能接受像我第一个代码块那样的东西。
System.nanoTime()
而不是System.currentTimeMillis()
。(链接) - Turamarth