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

标签 java performance jvm profiler jprofiler

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

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

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

最佳答案

I wanted the timing data to be constant when the same program was run multiple times

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

I am looking for some profiler that could give me the count of byte codes executed when a code is executed.

假设你能做到这一点,那证明不了什么。例如,您不会看到 ++% 便宜 90 倍,具体取决于您运行它的硬件。您将无法看到 if 的分支未命中比推测分支的代价高出 100 倍。您将看不到触发 TLB 未命中的对内存区域的内存访问比复制 4 KB 数据的成本更高。

if there could be some other metric based on which I could get timing data, which should stay almost constant across multiple runs.

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

关于java - 计算为 Java 代码执行的字节码的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25114261/

相关文章:

java - Java 8 中时区类中使用的冰岛的区域 ID 是什么?

java - 对 servlet 的多个 ajax 调用

java - Java 中的类型转换,技术信息

javascript - 通过性能 api 测量站点加载时间

objective-c - 高效和优化 Cocoa 应用的技巧

java - JVM 堆栈变量

java - 为什么 Eclipse 崩溃 Xmx, XX :MaxPermSize above certain values?

java - 有没有办法根据包中的所有 java 源文件生成哈希值,然后在运行时在日志消息中使用该值?

scala - 验证错误: Uninitialized object exists on backward branch/JVM Spec 4. 10.2.4

performance - 如何在 Unity3D 中优化场景加载