【发布时间】:2019-03-27 13:15:47
【问题描述】:
可以很方便地为代码执行计时,这样您就知道需要多长时间。但是,我发现这样做很草率,因为它应该具有相同的缩进,这使得阅读实际计时的内容变得更加困难。
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()(Link)。 -
@Henry 嗨亨利,我认为这不是重复的,考虑到它与微基准测试无关,因为我不想测试代码运行的快慢。但它更多的是关于记录,记录到文件或控制台,以指示生产中发生的事情有多快。
-
在应用程序容器中,您可以有一个方法 interceptor 注释来触发性能测量。
-
@RyanTheLeach 再说一次,我认为不是,这个问题是关于 如何 时间码,这个问题是关于时间码的更清洁、更易读的方式,这个问题已经表示知道如何计时码。
-
对于它的价值,我没有举报。一个紧密重复而不是重复。 (也许近乎重复会更好)
标签: java timing autocloseable