Java方法调用与使用变量

Sea*_*ull 46 java performance

最近我和我的团队负责人讨论了使用临时变量与调用getter方法的问题.很长一段时间我认为,如果我知道我将不得不多次调用一个简单的getter方法,我会将它放入一个临时变量然后使用该变量.我认为这在风格和性能方面都会更好.但是,我的主管指出,在Java 4和更新版本中,这有点不正确.他相信使用较小的变量空间,所以他告诉我,调用getter方法的性能命中非常微不足道,而不是使用temp变量,因此使用getter更好.但是,我并不完全相信他的论点.你们有什么感想?

Bil*_*l K 70

永远不要编写性能代码,始终编写可读性代码.让编译器完成工作.

他们可以改进编译器/运行时以更快地运行良好的代码,突然你的"快速"代码实际上减慢了系统的速度.

Java编译器和运行时优化似乎首先解决了更常见/可读的代码,因此您的"优化"代码更有可能在以后完全取消优化,而不是刚刚编写的代码.

TL;博士:

这个答案指的是Java代码"Tricks",就像引用的问题一样.它不是指正确的设计.例如,我编写了一个发现例程来联系B类网络中的每台计算机(64k地址) - 线程不是一个选项,它不是优化,而是软件设计.对ArrayList执行插入排序只是糟糕的编程,将其切换到LinkedList不是优化,这是一个错误修复!

  • 我同意精神,但不同意这封信.表演中有很多东西; 微优化只是一小部分,有时是性能关键代码的必然之恶.一个优秀的程序员选择他们的算法和数据结构作为计划的一部分,并且应该将性能作为设计过程的一部分进行考虑. (15认同)
  • 我更同意这一点.+100可维护性和易读性远远超过性能. (4认同)
  • @BobMcGee我完全同意 - 但我区分"编程"和"优化".当您有可用的链表时,对数组列表进行插入排序是我不知道如何编程的最佳示例. (3认同)

Ran*_*pho 24

你的领导是正确的.在VM的现代版本中,返回私有字段的简单getter被内联,这意味着不存在方法调用的性能开销.

  • @meriton:也许我不应该这么一般."简单的getter几乎总是由JIT编译器内联".更好?顺便说一句,这是Sun关于这个主题的研究演讲:http://research.sun.com/people/detlefs/talks/rice-98-talk/inline-talk.html.注意日期......夏天,98.这已经存在了十年. (2认同)

Pau*_*ham 14

不要忘记通过将getSomething()的值赋给变量而不是调用它两次,你假设getSomething()在你第二次调用它时会返回相同的东西.也许这是你所谈论的场景中的一个有效假设,但有时却不是.


tan*_*ens 11

这取决于.如果您想明确表示一次又一次使用相同的值,我会将其分配给临时变量.如果吸气器的召唤有点冗长,我会这样做的myCustomObject.getASpecificValue().

如果代码可读,您将获得更少的错误.所以这是重点.

性能差异很小或不存在.


Ale*_*yak 8

如果你记住代码演变,v1.0中的简单getter往往会成为v2.0中不那么简单的getter.

将简单的getter改为不那么简单的getter的编码器通常不知道有一个函数可以调用这个getter 10次而不是1次,并且从不在那里修改它等等.

这就是为什么从DRY原理的角度来看,缓存重复使用的价值是有意义的.


小智 6

我不会牺牲"代码可读性"到几微秒.
也许确实,getter表现更好,并且可以在运行时节省几微秒.但我相信,变量可以为你节省几个小时或者几天的时间来修复bug.

很抱歉非技术性的答案.