我正在考虑制作一个由大网格组成的对象,存储在二维数组中,以及在该网格上工作的函数。
如果我想遍历对象之外的这个数组中的元素,访问每个网格元素最可读和尊重隐私的方法是使用像grid.getElement(x,y)这样的函数,返回array [x] [y]。
当程序编译成字节码时,这是否比通过grid.array [x] [y]直接访问数组效率低?
答案 0 :(得分:6)
效率可能较低,但这取决于您的JVM。一个好的JIT可以内联函数,从而使代码完全等效。
唯一可以确定的方法是使用您将使用的JVM进行基准测试。在你做之前,你应该验证它是否重要。 (即:profile 然后优化)除非您的分析告诉您特定的代码片段是瓶颈,否则请使用最干净的设计,并且不要尝试像这样进行微优化。很有可能它无论如何都不会为你带来任何可衡量的性能提升,而且它肯定会让你的代码难以维护。
答案 1 :(得分:3)
效率可能略低,但您应该让编译器和JIT编译器为您进行优化。
您应该主要关注API的可读性和有效性,除非您确实发现了一些性能瓶颈。
答案 2 :(得分:3)
除了性能方面的考虑,通过功能访问的机制肯定是“更清洁”和“更安全”。首先,如果不提供修改功能,则可以将数组元素公开为只读。通过不提供对数组的引用,您还可以阻止对数组的其他可能不需要的访问;最后,通过不暴露数组,您将保持API在未来修改方面的灵活性,即用不同的数据结构替换数组。这些都是代码质量的好处,在大多数情况下应该比在函数中包装访问所带来的性能损失更重。
答案 3 :(得分:2)
很难肯定地说,如果这是性能足够重要,值得为它设计好的设计,我会说。
JIT将内联简单的函数,例如getter。在许多情况下,JIT也可以消除数组边界检查。因此,如果完成这些优化,将数组访问放在方法后面可能没有比直接访问它更差的性能,但如果没有完成,那么性能可能会受到影响。
但是你可能会发现,如果数组足够大,函数调用开销远小于cpu<>内存瓶颈,并且选择算法,例如在矩阵上使用“块”算法将产生最大的差异,而不是如何访问各个元素。