从Java内部测量各个方法的性能的确切方法?

mik*_*wse 6 java performance

我想测量一组单元测试的执行时间,以便能够在进行更改时自动监视和比较性能.是否有任何合适的性能计数器可以从Java本身轻松访问?即,类似于:

count1 = <call performance counter func>
executeUnitTest();
count2 = <call performance counter func>
testPerformance = count2 - count1;
Run Code Online (Sandbox Code Playgroud)

满足这些额外要求:

  • 即使测试运行器在虚拟客户操作系统中运行,也会给出与系统负载无关的相同答案(由于主机上的负载变化,这似乎取消了nanoTime()和朋友,甚至当前线程的CPU时间)
  • 给出相同的答案,与运行的硬件无关(计算执行的字节码指令数量非常好!)
  • 理想情况下,可以将GC执行计数与实际方法执行分开(如果GC在线程中完成)

Bur*_*ear 1

您可以考虑几种方法。

“检测”发生在编译或加载时,并更改类文件,以便它们记录正在发生的事情。通常,这用于执行诸如测量单元测试的代码覆盖率之类的事情,但您可能可以修改代码覆盖率工具以仅保留执行计数。根据记忆,代码覆盖率工具Emma是一个很好的开源起点。由于 GC 没有被检测,因此不会被计算在内。很可能有一些开箱即用的东西。

分析工具可能至少可以为您提供一些您想要的数据。有可用的堆,包括标准的“java”可执行文件,能够生成大量您可能会使用的信息。

VM 中还提供了相当复杂的分析挂钩,可以通过标准 JVMTI API 访问 API,从 IIRC 1.5 开始,该 API 是标准 API 的一部分。