我经常将代码包装在System.nanoTime()对中以对其进行计时。就像是:
long start = System.nanoTime();
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;
有什么好的时序库可以帮助解决这个问题吗?也将接受本地代码。
注意
探查器不是这里的解决方案,因为我想在我的单元测试中强制执行一些时间限制,所以我想以编程方式计时方法。
我经常将代码包装在System.nanoTime()对中以对其进行计时。就像是:
long start = System.nanoTime();
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;
有什么好的时序库可以帮助解决这个问题吗?也将接受本地代码。
注意
探查器不是这里的解决方案,因为我想在我的单元测试中强制执行一些时间限制,所以我想以编程方式计时方法。
忽略此答案,因为该项目不再处于活动状态
我没有使用它,但我最近遇到了perf4j。
不是您的问题的直接答案,但我也经常使用这个技巧来计时我的代码,并且只是编写了以下简单的 Eclipse -> Surround With template:
long startTime = System.currentTimeMillis();
${line_selection}${cursor}
long totalTime = System.currentTimeMillis() - startTime;
System.out.println("Total time = " + totalTime);
System.out.println();
JUnit 4 有一个内置的时序约束功能。
@Test(超时=X)
应该做的伎俩。X 是允许该方法运行的最大毫秒数。
有来自 commons-lang 的StopWatch,它还允许您拆分计时器。
如果您使用的是 Spring,那么您的类路径中已经有一个名为StopWatch的好类,用于此建议。
JETM是一个很好的库。它还可以提供最小值、最大值和平均值,还可以生成信息图表。
Something new on the market is JMH. It's made under the umbrella of the openjdk project.
我刚刚开始使用Java Simon(以前在 Google Code 上),它看起来很棒!一组简单的秒表和计数器,几乎没有依赖关系。
试过JPerf吗?
您正在寻找什么样的帮助来解决这个问题?你已经具备了基础知识。你得到以纳秒为单位的经过时间,精确到底层操作系统/硬件能够达到的任何分辨率。
另外...而且我知道您说没有分析器...但是我在YourKit方面拥有出色的经验。它提供了一个 API,您可以使用该 API 从外部控制分析。根据您的确切问题,这个可能值得一看。
考虑到多线程环境的 commons-lang StopWatch的简单包装器,当不调用停止时,不计算跳跃统计并且“失败的跳跃计数”递增(如果需要行为,您可能不包括 stop 在 finally 块中),暴露通过 JMX 进行实时统计,并通过网络提供统一的可序列化结果。示例用法:
private PerfStat methodPerf = new PerfStat("method.under.test");
...
public void myMethod() {
methodPerf.start();
...
long timeNs = methodPerf.stop();
}
依赖
<dependency>
<groupId>org.droolsassert</groupId>
<artifactId>da-utils</artifactId>
</dependency>