Java性能计时库

22

我经常使用System.nanoTime()来包装代码以计时。类似于:

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

有没有好的时间库能够帮助解决这个问题?同时,自己编写的代码也是可以接受的。

NB

使用分析工具并不是一种解决方案,因为我想在单元测试中强制执行一些时间限制,所以我需要通过编程方式计时方法。


我不明白你试图解决的“问题”是什么。你在顶部有一行,底部再加上一行来给你计算经过的时间。你只需要一个变量来保存它。你可以将其封装在一个类中,或者使用Stopwatch类,但这并不会真正减少代码的复杂性:你仍然需要在顶部有一行,在底部有一行。你是想要帮助记录和跟踪大量这样的计时吗? - AgilePro
12个回答

10

由于该项目不再活跃,因此请忽略此回答

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


@Mark:从未听说过。非常感谢! - dfa
你甚至可以使用集成的servlet在perf4j中绘制图形。这非常不错。 - unludo
链接已损坏 :-( - mjaggard

9

虽然不是对你问题的直接回答,但我也经常使用以下技巧来计时我的代码,并编写了以下简单的Eclipse -> Surround With模板:

long startTime = System.currentTimeMillis();
${line_selection}${cursor}
long totalTime = System.currentTimeMillis() - startTime;
System.out.println("Total time = " + totalTime);
System.out.println();

不幸的是,我是一个NetBeans用户 -:) - dfa

8

JUnit 4内置了时间限制功能。

@Test(timeout=X)

可以解决问题。X是方法允许运行的最大毫秒数。


是的,这是一个非常基础的实现,本质上我正在寻找@Test(timeout=X, repeat=N),然后显示平均值。 - dfa

7

有一个来自commons-lang的StopWatch,它还允许你分割计时器。


很高兴看到它,但它只封装了System.nanoTime/System.currentTimeMillis调用。 - dfa
使用起来总是比默认版本更容易 ;) - IAdapter

4

如果你正在使用Spring,那么你的类路径中已经有了一个很好的类叫做StopWatch,可以用于此目的。


2

JETM 是一个很好的库,用于做这件事情。它还可以提供最小值、最大值和平均值,并能够生成信息丰富的图表。


看起来没有维护,对于任何对此感兴趣的人来说。只能在HTTP上运行,JavaDoc无法访问。 - Maarten Bodewes

1
市场上有一款新产品JMH,它是在openjdk项目的保护下制作的。

1
我刚开始使用Java Simon(以前在Google Code上),它看起来很棒!一个简单的秒表和计数器集合,依赖性很少。

1

使用 Google 缓存查看用法,或者检查 xjperf 的链接:http://code.google.com/p/xjperf/。 - techzen
它似乎是iperf的前端,它是“测量最大TCP和UDP带宽性能的现代替代品”。是这样吗? - dfa

1
你在这个问题上需要什么样的帮助?你已经有了基础。你可以获得以纳秒为单位的经过时间,精确到底层操作系统/硬件所能达到的分辨率。
另外...我知道你说不要使用分析器...但是我使用YourKit时有非常出色的体验。它提供了一个API,可以从外部控制分析。根据你的具体问题,这个工具可能值得一试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接