我有一个运行4096次的for循环,它应该尽可能快。在这里,性能真的很重要。目前,我在循环内部使用getter方法,这些方法仅从循环过程中不更改的字段中返回值或对象。
例子:
for (;;) {
doSomething(example.getValue());
}
使用吸气剂会产生任何开销吗?使用以下方法是否更快?
例子:
Object object = example.getValue();
for (;;) {
doSomething(object);
}
如果是的话,访问诸如这样的公共字段也适用example.value
吗?
编辑:我不在System.out.println()
循环内使用。
编辑:有些字段不是final
。没有字段volatile
,没有方法(getter)是synchronized
。
正如Rogério回答的那样,在循环(Object object = example.getValue();
)之外获取对象引用可能比在循环内调用getter更快(或至少永远不会更慢),因为
example.getValue()
尽管应该假设吸气方法“微不足道”,但实际上可能会在后台执行一些非常昂贵的计算。通过一次分配引用并重新使用它,您只需执行一次昂贵的计算。example.getValue()
执行一些琐碎的事情,例如return value;
在JIT编译器内联代码之后,在循环内分配它不会比在循环外花费更多。但是,更重要的是两者之间的语义差异及其在多线程环境中可能产生的影响:如果对象的状态example
发生变化,导致example.getValue()
返回对不同对象的引用,则可能在每次迭代中,该方法doSomething(Object object)
实际上将Object
通过直接调用在的不同实例上进行操作doSomething(example.getValue());
。在另一方面,通过调用循环外的吸气剂,并设置为返回的实例(基准Object object = example.getValue();
),doSomething(object);
将操作的信息object
Ñ为倍Ñ迭代。
语义上的这种差异可能导致多线程环境中的行为与单线程环境中的行为发生根本不同。此外,这不一定是实际的“内存中”多线程问题:如果example.getValue()
依赖于例如数据库/ HDD /网络资源,则此数据可能在循环执行期间发生更改,从而有可能使用其他对象即使Java应用程序本身是单线程的,也返回。出于这个原因,最好考虑使用循环实际要完成的工作,然后选择最能反映预期行为的选项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句