8

我想运行一个单元测试并收集它的“分析”信息:每个方法被调用的频率、某个类的多少个实例被创建、执行某个方法/线程需要多少时间等等。然后,我想要将此信息与一些预期值进行比较。是否有任何适用于 Java 的 Profiler 可以让我这样做(当然,所有这些都应该自动完成,无需任何 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)
    );
  }
}
4

2 回答 2

3

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

JProfiler中,您可以使用“profile”ant 任务来执行此操作。它从从 JProfiler GUI 导出的配置文件中获取分析设置。您可以使用Controller API开始录制并保存快照。

那么你有两个选择:

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

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

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

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

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

于 2012-05-18T09:04:00.050 回答
2

我发现这可以使用 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,这与其他工具相比具有很大的优势。

于 2012-05-23T06:08:38.927 回答