我一直在使用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下是这样。
例如-我使用采样进行了一次剖析,报告说该应用程序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下是这样。
atan
是内置的,而不是调用方法,我也不会感到惊讶 - 相应的机器代码将被嵌入行内。 - Tom Hawtin - tackline