Java效率:对象分配&方法调用与内联方法调用

时间:2010-01-19 17:31:17

标签: java performance

我正在使用3D视口处理应用程序,该视口每秒刷新30次(或者至少尝试快速渲染)。不幸的是,代码很复杂,只需将其转换为测试性能效果就需要一段时间,但我要比较的两个条件如下:

ObjectToRender p = objectsToRender.get(i);
p.render();

而不是:

objectsToRender.get(i).render();

我确信这听起来像是一个严重的微优化案例,但是,如上所述,此代码不断被调用,并且没有外部因素影响其性能(磁盘I / O,网络等)。 / p>

5 个答案:

答案 0 :(得分:7)

我希望这两段代码能够JIT编译成完全相同的机器代码,假设你在这个片段之后的任何地方都不使用“p”。

答案 1 :(得分:2)

应该没有什么区别,但我看到了性能差异,我认为我不应该看到它。

正如您所说,它似乎是一种微优化,您可能会通过寻找更大的优化(例如代码重构或甚至使用不同的图形工具包)来获得更多的优势。

如果您关心帧速率,则应显示或记录帧速率,并为给定的预编程测试设置一些标准化目标。完成此操作后,测试较小的更改应该会立即给出有关各种调整的反馈。

如果没有测量它们的能力,请不要进行“性能增强”。这就像你迷路了,并建议将你的行驶速度提高到40英里/小时以上,因为你没有时间停下来询问方向。

答案 2 :(得分:1)

大多数现代编译器足够智能,可以生成非常优化的字节码。我怀疑上述2个电话应该有所不同。实际上,它们会产生相同的字节代码。

答案 3 :(得分:0)

您建议的更改不应该是重要的,尽管您可能会从基于索引的列表访问(我假设您正在使用“get(i)”)转移到阵列访问时获得改进。

答案 4 :(得分:0)

可以使用迭代器循环遍历所有要呈现的对象来优化代码的objectsToRender.get(i)部分:

iterator.next().render();

或者,如果对象列表稳定,则将其转换为ObjectToRender[]一次并直接索引:

objectsToRender[i].render();