可读性与性能

时间:2013-10-31 14:33:33

标签: java performance code-readability

最近我们讨论了局部变量对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());

我意识到第一个声明本身并不是很难掌握,但是当大多数代码的结构都是这样时,复杂性会相当快。

感谢您的投入。

6 个答案:

答案 0 :(得分:15)

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

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

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

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

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

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

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

答案 1 :(得分:14)

  

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

不,他们不是。将内容存储在局部变量中然后随后从中读取的成本接近0,就这么简单 - 这肯定不是你应该花时间优化的东西,甚至是令人担忧的就此而言。不要因为把所有东西放在一条高度复杂的线上而牺牲可读性。

答案 2 :(得分:11)

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

如果预计代码行的执行次数将超过程序员所能看到的数百万倍,那么或许你应该考虑进行优化。但肯定不会到那时。

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

别忘了! Premature optimization is the root of all evil

答案 3 :(得分:4)

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

  • 两次拨打new

  • SelectionContext构造函数

  • 致电getRole_id()

  • DeleteSomethingCmd构造函数

  • 致电GetResultContainer()

  • 致电execute()

  • deleteSomethingCmd成员

所以假设你运行了这么多次,并且在那个时候你需要一些堆栈样本。

您认为堆栈示例在其中一个函数调用中显示的概率是多少?

非常低,对吗?可能远不到百分之一?

所以即使你在这个级别无限快速制作代码,它能为你节省多少?

透视就是一切。

答案 4 :(得分:3)

第一个版本比第二个版本更高效。我怀疑你能否可靠地衡量性能差异。此外,在jit优化之后,结果机器代码应该是相同的。

答案 5 :(得分:1)

严格地说这些例子,不,两者之间没有可衡量的差异(不论在现代系统上)。但是,通过编写大量较低级别的代码来执行可以在较高级别使用较少代码执行的操作,能够显着提高性能是非常正确的。例如,在许多情况下使用数组比使用任何Collections API更快(可能不多,但确实如此)。但是你不仅失去了可读性,而且还失去了可操作性,通常是因为性能的微小提升。

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