自动比较单个单元测试的 Java 性能分析结果



我想运行单个单元测试并收集其"分析"信息:调用每个方法的频率,创建某个类的实例数,执行某些方法/线程需要多少时间等。然后,我想将此信息与一些预期值进行比较。有没有Java的探查器让我这样做(当然,所有这些都应该自动完成,没有任何GUI或用户交互(?

这就是我希望它的工作方式:

public class MyTest {
  @Test
  public void justTwoCallsToFoo() {
    Profiler.start(Foo.class);
    Foo foo = new Foo();
    foo.someMethodToProfile(); // profiler should collect data here
    assertThat(
      Profiler.getTotalCallsMadeTo(Foo.class, "barMethod"), 
      equalTo(3)
    );
  }
}
使用多个 Java 探查器

可以自动捕获分析信息的快照,您必须将 VM 参数添加到 Java start 命令以加载探查器,并且必须告诉探查器记录数据并在退出时保存快照。

在 JProfiler 中,您可以使用 "profile" ant 任务来执行此操作。它从从 JProfiler GUI 导出的配置文件中获取性能分析设置。您可以使用控制器 API 开始记录和保存快照。

那么你有两个选择:

  1. 可以使用 jpcompare 命令行实用程序或相应的"比较"ant 任务将快照与已知基线进行比较。有几种比较可用。您可以将结果导出为 HTML 或机器可读格式 (CSV/XML(。

  2. 您可以使用 jpexport 命令行实用程序或相应的"export"ant 任务从快照中提取数据。然后,您可以编写自己的代码来分析特定运行中的分析数据。

对于一组有限的分析数据,实际上可以使用 JProfiler API 编写自己的探查器,该探查器执行类似于示例中Profiler.getTotalCallsMadeTo(Foo.class, "barMethod")的操作。请参阅 JPofiler 安装中的api/samples/platform示例。您将从热点数据中获取信息。

但是,为了断言是否调用了特定方法,我建议采用基于 AOP 的方法。使用基于探查器的方法适用于检测性能回归。

免责声明:我公司开发JProfiler。

我发现这可以通过 J2SE 内置的 HPROF 分析工具来完成。

java -agentlib:hprof=cpu=times MyTest

它生成一个格式如下的文本文件:

CPU SAMPLES BEGIN (total = 126) Fri Oct 22 12:12:14 2004
rank   self  accum   count trace method
   1 53.17% 53.17%      67 300027 java.util.zip.ZipFile.getEntry
   2 17.46% 70.63%      22 300135 java.util.zip.ZipFile.getNextEntry
   3  5.56% 76.19%       7 300111 java.lang.ClassLoader.defineClass2
   4  3.97% 80.16%       5 300140 java.io.UnixFileSystem.list
   5  2.38% 82.54%       3 300149 java.lang.Shutdown.halt0
....

然后,可以轻松解析文件并提取您感兴趣的方法。该解决方案是完全免费的,并且内置JSE,与其他工具相比,这是一个很大的好处。

最新更新