我目前正在使用YourKit Java分析器来调整相当复杂的计算机仿真。但是,我对大约十分钟的分析会话中出现的一些结果感到有些困惑。例如,
Method Time (ms)
MyClass.java:185 124,032
MyClass.java:185 > Complicated.doMath(MyClass) 157,032
MyClass.java:176 113,645
MyClass.java:176 > Sparse3DLattice.setObjectLocation(Object, Int3D) 185,233
在所谓的方法中,延迟是有意义的。 doMath
进行了一些相当复杂的计算,setObjectLocation
更新了对象在HashMap中的位置。
但是,第185行和第176行都非常简单,因为它们基本上只是调用一个方法。第176行如下所示:
// Set the new location
location = new Int3D(x, y, z, Sparse3DLattice.hashCoordinates(x, y, z));
grid.setObjectLocation(this, location); // 176
// End of method
第185行是用一种简单的方法包装的,
private boolean doMath() {
return complicated.doMath(this); // 185
}
假设分析器是正确的,因为方法调用要花费大量时间,我怀疑这是因为MyClass
是一个相当复杂的对象。由于JVM needs to do work传递了this
,因此延迟由此而来。
这是一个合理的假设吗?如果是这样,在这些情况下我该如何提高性能?