我一直在使用 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 下是这样。