我正在使用 TPTP 来分析一些运行缓慢的 Java 代码,我遇到了一些有趣的事情。我的一个私有属性 getter 在执行时间分析结果中具有很大的基准时间值。公平地说,这个属性被调用了很多次,但我从来没想过这样的属性会花费很长时间:
public class MyClass{
private int m_myValue;
public int GetMyValue(){
return m_myValue;
}
}
好的,所以类中显然有更多的东西,但是正如您所看到的,当调用 getter 时没有其他任何事情发生(只是返回一个 int)。给你一些数字:
- 大约 30% 的运行调用都在 getter 上(我正在努力减少这种情况)
- 运行的大约 25% 的基本时间都花在了这个 getter 上
- 平均基准时间为 0.000175s
为了比较,我在不同的类中有另一个方法使用这个getter:
private boolean FasterMethod(MyClass instance, int value){
return instance.GetMyValue() > m_localInt - value;
}
它的平均基准时间要低得多,为 0.000018 秒(低一个数量级)。
这是怎么回事?我认为有些东西我不明白或我遗漏了一些东西:
- 返回本地原语真的比返回计算值需要更长的时间吗?
- 我应该查看基准时间以外的指标吗?
- 这些结果是否具有误导性,我需要考虑其他一些分析工具吗?
编辑1:根据下面的一些建议,我将该方法标记为最终并重新运行测试,但我得到了相同的结果。
编辑 2:我安装了 YourKit 的演示版来重新运行我的性能测试,YourKit 结果看起来更接近我的预期。我将继续测试 YourKit 并报告我的发现。
编辑 3:更改为 YourKit 似乎解决了我的问题。我能够使用 YourKit 来确定我的代码中的实际慢点。下面有一些很好的评论和帖子(适当地赞成),但我接受第一个建议 YourKit 为“正确”的人。(我不以任何方式隶属于 YourKit / YMMV)