5

我一直在使用 Yourkit 8.0 分析在 Mac OS X(10.5.7,Apple JDK 1.6.0_06-b06-57)下运行的数学密集型应用程序,并注意到 CPU 分析结果中有一些奇怪的行为。

例如 - 我使用采样进行了分析运行,它报告应用程序的 10 分钟运行时间中有 40% 用于 StrictMath.atan 方法。我发现这令人费解,但我相信了它的话,并花了一些时间用极其简单的多项式拟合替换 atan。

当我再次运行该应用程序时,它所用的时间几乎与以前完全相同(10 分钟) - 但我的 atan 替换在分析结果中没有出现。相反,其他主要热点的运行时间百分比只是增加了以弥补它。

总结一下:

StrictMath.atan 的结果(本机方法)
总运行时间:10 分钟
方法 1:20%
方法 2:20%
方法 3:20%
StrictMath.atan:40%

结果使用简化的纯 Java atan
总运行时间:10 分钟
方法 1:33%
方法 2:33%
方法 3:33%

(方法 1,2,3 不执行任何 atan 调用)

知道这种行为是怎么回事吗?我使用 EJ-Technologies 的 JProfiler 得到了相同的结果。似乎 JDK 分析 API 报告了本机方法的不准确结果,至少在 OS X 下是这样。

4

6 回答 6

3

这可能是由于采样时间不一致而发生的。因此,例如,如果一个方法使用了相当长的时间,但执行时间并不长,那么采样可能会错过它。另外,我认为垃圾收集在样本期间永远不会发生,但如果某些代码导致大量垃圾收集,它可能会大大降低速度而不会出现在样本中。

在类似的情况下,我发现运行两次非常有帮助,一次是跟踪,一次是采样。如果一个方法出现在两者中,它可能使用了大量的 CPU,否则它很可能只是采样过程的产物。

于 2009-07-07T23:58:16.967 回答
0

我发现 YourKit 大大夸大了调用子方法的成本(我假设是由于它的日志记录方法)。如果您只遵循配置文件给您的建议,您最终只会合并功能而没有真正的收益,因为 HotSpot 通常在这方面做得很好。

因此,我强烈建议也完全在分析器之外测试批次,以便更好地了解更改是否真的有益(这似乎很明显,但这会花费我一些开发时间)。

于 2009-07-08T00:07:06.463 回答
0

您可能想查看传递给这三个方法的参数。可能时间花在生成返回值或创建大量临时对象的方法上。

于 2009-07-08T22:02:32.440 回答
0

由于您使用的是 Mac,您可以尝试Apple 的 Shark 分析器(从 ADC 免费下载),它支持 Java,并且 Apple 的性能小组已经在该工具上投入了大量时间。

正如尼克指出的那样,如果采样间隔与函数的执行时间足够接近,并且分析器很少检查函数实际执行的时间,则采样可能会产生误导。我不知道 YourKit 是否支持这一点,但在 Shark 中,您可以将采样间隔更改为默认 10 毫秒以外的值,看看结果是否有很大不同。还有一个单独的调用跟踪模式,它将记录每个函数的输入/返回 - 这完全避免了别名错误的可能性,但会收集大量数据和更高的开销,如果您的应用程序正在执行任何类型的实时处理,这可能很重要.

于 2009-07-08T14:26:41.630 回答
0

值得注意的是,如果 Java 方法足够小,则可以内联,但是本地方法在不同的规则下内联。如果一个方法是内联的,它不会出现在分析器中(当然不是 YourKit)

于 2009-07-10T16:14:18.943 回答
-1

探查器可以是这样的。

这是我使用的方法。

每次都有效。

这就是为什么。

于 2009-07-10T13:57:54.510 回答