可读性与性能

2022-09-02 23:17:17

最近,我们在工作中讨论了局部变量对Java代码的性能与可读性的影响。我的一些同事认为,这样的声明

new DoSomethingCmd(new SelectionContext(context, keys), infoStuff.getCurrentRole().getRole_id()).execute(getResultContainer());

将为应用程序提供可观的性能提升。他们愿意为此牺牲代码的可读性。他们这样说是对的吗?上面的版本是否比这个版本的性能要高得多?

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

我意识到第一个语句本身并不是那么难以掌握,但是当大多数代码都是这样构建时,复杂性很快就会增加。

感谢您的输入。


答案 1

“优化”版本唯一做的是,堆栈中的变量较少,从而略微增加了内存消耗。应该仔细衡量性能(谷歌如何对一个问题进行基准测试),但我严重怀疑它是否有任何明显的效果。

此外,花时间在不经常使用的代码中提高性能只是浪费开发人员的时间,这是昂贵的。

在这种情况下,可读性应该赢得胜利。

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

new DoSomethingCmd(
    new SelectionContext(context, keys),
    infoStuff.getCurrentRole().getRole_id()
    ).execute(getResultContainer());

此文本的优点是您没有不再需要的已定义变量 (, )(因此当您再次阅读该方法时,它们不会与更“持久”的变量混合)。无论如何,这是可以解释的。底线是,除非您有动机这样做,否则您不必担心优化。selectionContextroleId

除此之外,Java编程还有一些指南,可以为您提供真正有用的技巧,这些技巧确实可以帮助您(例如,用于连接字符串)。StringBuilder


答案 2

他们这样说是对的吗?

不,他们不是。将某些内容存储在局部变量中然后随后从中读取的成本接近于0,就这么简单 - 这绝对不是您应该花时间优化甚至担心的事情。不要因为将所有内容放在一个高度复杂的行中而牺牲可读性。


推荐