可读性与性能

dri*_*nif 15 java performance code-readability

最近我们讨论了局部变量对Java代码的性能与可读性的影响.我的一些同事的意见是这样的声明

new DoSomethingCmd(new SelectionContext(context, keys), infoStuff.getCurrentRole().getRole_id()).execute(getResultContainer());
Run Code Online (Sandbox Code Playgroud)

将为应用程序提供相当大的性能提升.他们愿意为此牺牲代码可读性.他们是否正确地声称这个?上述版本的性能是否比这个版本高得多?

final SelectionContext selectionContext = new SelectionContext(context, keys);
final String roleId = infoStuff.getCurrentRole().getRole_id();
final DeleteSomethingCmd deleteSomethingCmd = new DeleteSomethingCmd(selectionContext,roleId);
deleteSomethingCmd.execute(getResultContainer());
Run Code Online (Sandbox Code Playgroud)

我意识到第一个语句本身并不难以掌握,但是当大多数代码都是这样构造时,复杂性会相当快.

谢谢您的意见.

SJu*_*n76 15

"优化"版本唯一能做的就是堆栈中少了几个变量,稍微增加了内存消耗.应该仔细衡量绩效(谷歌如何对问题进行基准测试),但我严重怀疑它有任何明显的影响.

此外,花费时间来改善一段经常不使用的代码的性能只是浪费开发人员的时间,这是昂贵的.

在这种情况下,可读性应该赢得一天.

编辑:无论如何,如果你使用适当的缩进,我不认为这两个版本在可读性方面有太大的不同:

new DoSomethingCmd(
    new SelectionContext(context, keys),
    infoStuff.getCurrentRole().getRole_id()
    ).execute(getResultContainer());
Run Code Online (Sandbox Code Playgroud)

本文的优点是您没有不再需要的已定义变量(selectionContext,roleId)(因此,当您再次阅读该方法时,它们不会与更多"持久"变量混合).无论如何,这是可以解释的; 最重要的是,你不应该担心优化,除非你有动机这样做.

除此之外,还有一些Java编程指南可以为您提供真正有用的技巧(vg StringBuilder用于连接字符串).

  • 由于堆栈空间是预先分配的,我不会签署堆栈上的某些变量会增加内存消耗.在需要额外的内存块之前,您需要数千个额外的变量. (6认同)

ars*_*jii 14

他们是否正确地声称这个?

不,他们不是.将东西存储在局部变量中然后随后读取它的成本接近0,就这么简单 - 这绝对不是你应该花时间优化,甚至担心这件事.不要将所有内容放在一条高度复杂的线路中,从而牺牲可读性.


Old*_*eon 11

一个人的时间比计算机的时间贵数百万倍.

如果预计代码行执行的次数比程序员看到的数百万倍,那么也许你应该考虑进行优化.但肯定不会到那时.

即使这样,优化就像编译器是愚蠢的一样完全没有意义.

别忘了!过早优化是万恶之源.