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());

我意识到第一个语句本身并没有那么难以掌握,但是当您的大多数代码都采用这种结构时,复杂性会很快增加。

谢谢您的意见。

4

6 回答 6

15

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

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

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

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

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

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

除此之外,还有一些 Java 编程指南,它们为您提供真正有用的技巧,真正帮助您(vgStringBuilder用于连接字符串)。

于 2013-10-31T14:38:43.330 回答
14

他们声称这一点是对的吗?

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

于 2013-10-31T14:36:41.050 回答
11

一个人的时间比电脑的时间贵几百万倍。

如果预计代码行的执行次数比程序员看到的要多几百万倍,那么也许您应该考虑进行优化。但肯定不会在那之前。

即便如此,就好像编译器很愚蠢一样进行优化是完全没有意义的。

不要忘记!过早的优化是万恶之源

于 2013-10-31T14:42:26.050 回答
4

我在这里看到几个函数调用

  • 两个电话new

  • 构造SelectionContext函数

  • 打电话给getRole_id()

  • 构造DeleteSomethingCmd函数

  • 打电话给GetResultContainer()

  • execute()成员的电话deleteSomethingCmd

因此,假设您运行了无数次,并且在那段时间内您获取了一些堆栈样本。

你认为堆栈样本在其中一个函数调用中没有向你展示的概率是多少?

极低,对吧?可能远低于百分之一?

所以即使你在这个级别上无限快地编写代码,它会为你节省什么?

透视就是一切。

于 2013-10-31T18:33:07.390 回答
3

第一个版本比第二个版本性能要好得多。我怀疑您能否可靠地衡量性能差异。而且,经过jit优化后,结果机器码应该是一样的。

于 2013-10-31T14:38:16.483 回答
1

严格来说这些例子,不,两者之间没有可测量的差异(不是在现代系统上,无论如何)。但是,确实可以通过编写大量较低级别的代码来完成在较高级别上用较少代码完成的工作,从而显着提高性能。例如,在许多情况下,使用数组比使用任何 Collections API 都要快(也许不多,但确实如此)。但是这样做不仅会失去可读性,还会失去可维护性,而且通常只会对性能进行微不足道的提升。

代码应始终井井有条且易于阅读。只有在获得良好的性能指标之后,您才应该考虑放弃它以提高性能。

于 2013-10-31T14:49:56.057 回答