java - 什么是在 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));
一次尝试
我想出了以下,它看起来好多了,有一些优点和缺点:
好处:
- 由于缩进,很明显正在计时
- 它会自动打印代码完成后需要多长时间
缺点:
- 这不是
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 中的代码执行,您可以清楚地看到正在计时的内容,或者我只需要满足于我的第一个代码块之类的东西。
解决方案
你的解决方案很好。
一种表达较少的方法是将代码包装在 lambda 中进行计时。
public void timeCode(Runnable code) {
...
try {
code.run();
} catch ...
}
...
}
timeCode(() -> { ...code to time... });
您可能希望捕获已检查的异常并将它们传递给某个运行时异常或其他什么。
推荐阅读
- jquery - 勾选全选后从关闭下拉列表中停止 Select2
- r - 获取 URL 的特定部分
- spring - 在 Spring 中将插件添加到应用程序上下文
- fabricjs - 当我从 FabricJS builder 下载时,BlendImage 过滤器不可用
- c# - 在 NGUI 中删除子级
- excel - Excel Power 数据透视表中的额外列
- arrays - 如何检查值是否存在于数组中?
- amazon-web-services - 为什么 AWS X-Ray 不显示错误?
- ruby-on-rails - 如何解决您的 Ruby 版本是 2.3.1,但您的 Gemfile 指定的是 2.5.1?
- mongodb - 本地 MongoDb 与 CosmosDb 查询执行的差异