22

我经常将代码包装在System.nanoTime()对中以对其进行计时。就像是:

long start = System.nanoTime();    
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;

有什么好的时序库可以帮助解决这个问题吗?也将接受本地代码。

注意

探查器不是这里的解决方案,因为我想在我的单元测试中强制执行一些时间限制,所以我想以编程方式计时方法。

4

12 回答 12

10

忽略此答案,因为该项目不再处于活动状态

我没有使用它,但我最近遇到了perf4j

于 2009-08-06T08:44:47.527 回答
9

不是您的问题的直接答案,但我也经常使用这个技巧来计时我的代码,并且只是编写了以下简单的 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();
于 2009-08-06T06:12:13.077 回答
8

JUnit 4 有一个内置的时序约束功能。

@Test(超时=X)

应该做的伎俩。X 是允许该方法运行的最大毫秒数。

于 2009-08-06T08:25:41.577 回答
7

有来自 commons-lang 的StopWatch,它还允许您拆分计时器。

于 2009-08-06T06:27:51.580 回答
4

如果您使用的是 Spring,那么您的类路径中已经有一个名为StopWatch的好类,用于此建议。

于 2009-09-10T21:27:47.167 回答
2

JETM是一个很好的库。它还可以提供最小值、最大值和平均值,还可以生成信息图表。

于 2011-12-07T12:54:14.687 回答
1

Something new on the market is JMH. It's made under the umbrella of the openjdk project.

于 2014-09-25T14:06:58.530 回答
1

我刚刚开始使用Java Simon(以前在 Google Code 上),它看起来很棒!一组简单的秒表和计数器,几乎没有依赖关系。

于 2014-11-02T23:36:19.347 回答
1

卡尺

除了阅读该网站上的 wiki 之外,我建议阅读:

于 2011-12-07T13:32:57.833 回答
1

试过JPerf吗?

于 2009-08-06T06:16:25.673 回答
1

您正在寻找什么样的帮助来解决这个问题?你已经具备了基础知识。你得到以纳秒为单位的经过时间,精确到底层操作系统/硬件能够达到的任何分辨率。

另外...而且我知道您说没有分析器...但是我在YourKit方面拥有出色的经验。它提供了一个 API,您可以使用该 API 从外部控制分析。根据您的确切问题,这个可能值得一看。

于 2009-08-06T06:17:13.240 回答
0

考虑到多线程环境的 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>
于 2012-05-17T12:10:24.027 回答