计算为Java代码执行的字节代码的最佳方法

时间:2014-08-04 08:12:07

标签: java performance jvm profiler jprofiler

我试图获取各种Java程序的计时数据。然后我不得不根据这个时间数据进行一些回归分析。以下是我用来获取时序数据的两种方法:

  • System.currentTimeMillis():我最初使用过这个,但是当同一个程序运行多个时,我希望时间数据保持不变 倍。在这种情况下,变化是巨大的。当两个实例的时候 相同的代码并行执行,变化甚至更多。所以 我放弃了这个并开始寻找一些分析器。
  • -XX countBytecodes Hotspot JVM中的标志:由于时序数据的变化很大,我想到了在执行此代码时测量执行的字节码数。当同一个程序多次执行时,这应该给出一个更静态的计数。但这也有变化。当程序按顺序执行时,变化很小,但在相同代码的parellel运行期间,变化是巨大的。我也尝试使用-Xint进行编译,但结果相似。

所以我正在寻找一些可以给我执行代码时执行的字节代码计数器的分析器。在同一程序的运行中,计数应保持不变(或相关性接近1)。或者,如果可能存在其他一些指标,我可以根据这些指标获得时间数据,这些数据应该在多次运行中几乎保持不变。

1 个答案:

答案 0 :(得分:4)

  

我希望当同一个程序多次运行时,时序数据是恒定的

这在真机上是不可能的,除非它是专为硬实时系统设计的,你的机器几乎肯定不会。

  

我正在寻找一些可以给我执行代码时执行的字节代码计数器的分析器。

假设你可以做到这一点,那就不会有任何证据。例如,++%便宜90倍,具体取决于您运行它的硬件。您将无法看到if的分支未命中比推测分支贵100倍。您将无法看到对触发TLB未命中的内存区域的内存访问比复制4 KB数据更昂贵。

  

如果可能存在其他一些指标,我可以根据这些指标获得时间数据,这些数据应该在多次运行中几乎保持不变。

您可以多次运行并取平均值。这将隐藏任何高结果/异常值,并为您提供有利的吞吐量概念。如果运行时间足够长,它可以是给定机器的可重现数字。