Java - 调用对象的get方法比使用本地对象更慢?

时间:2012-03-26 09:34:19

标签: java refactoring

我有一个变量,我在课堂上多次使用,速度很重要,我想用最快的方法。

使用时的速度是否有差异:

modifyValue(User.getSession().getSessionValue());

并将信息设置为本地值,例如

private String sessionValue;
sessionValue = User.getSession().getSessionValue();
modifyValue(sessionValue);

在几个不同的地方使用变量?哪种风格更好,还是更清楚明白?如果上面的例子当前正在现有代码中使用,那值得花时间进行重构吗?

6 个答案:

答案 0 :(得分:9)

我不相信速度差异。这种微观优化可能会让你误入歧途。

如果可写私有成员变量未正确同步,则可能存在线程安全问题。

我更喜欢第一个,因为它避免了不必要的可写状态。

答案 1 :(得分:2)

这些事情的性能优化实际上只能根据测量结果进行,而不是通过推理代码。

你应该问自己,花时间尝试微观优化陈述是否真的值得。一种更好的方法是首先编写有效的代码,然后使用分析器来确定性能瓶颈是什么。然后专注于改善这些。尝试微观优化语句几乎不会让你获得任何东西。所以我建议你不要再担心微观优化了。对分析器指示的位置进行基本优化工作是一个瓶颈。

Oracle的JVM和JIT在运行时进行了大量复杂的优化。例如,对简单getter方法的方法调用很可能是内联的,因此甚至不需要方法调用。在您的问题中,这两段代码之间几乎没有任何区别,这些代码将由JIT优化为可能完全相同的代码。

答案 2 :(得分:1)

显然使用

modifyValue(User.getSession().getSessionValue());


有时会快一点。
它的编译时间比运行时间更快 这对小型程序来说没问题,
但在考虑代码的可维护性时,
使用变量可能有助于长时间运行。

答案 3 :(得分:1)

每次方法调用都需要时间。因此,将对象引用到成员字段会减少调用方法时发生的操作次数,因此理论上会提高速度。

但是:考虑这种优化被称为“Premature optimization” - 众所周知的软件开发者的错误。尽量避免它。

答案 4 :(得分:1)

不,它并不慢。编译器和JVM的即时编译器进行优化,因此它应该是相同的。但这是代码质量/可读性的问题。如果您使用多个方法调用编写大型单行代码,则代码难以阅读。

答案 5 :(得分:0)

对于大多数用途,两者在速度方面是相同的。

关于可维护性,如果方法不重要,我更喜欢将值存储在本地(final)变量中。

关于数据安全性,根据您的描述,我建议将其存储在局部变量中,因为代码无法确定中间方法永远不会产生null值,并且您不希望到处都是getSession()的返回值。