1

我相信这可能是一个premature optimization问题或其他问题。

对于以下两个代码片段,

public void doSomething1(final int a) {
    final int b = a -1;
    doSomethingElse(b);
    doSomethingElse(b);
}

public void doSomething2(final int a) {
    doSomethingElse(a - 1);
    doSomethingElse(a - 1);
}

是否doSomething1优于doSomething2?是否doSomething2使用两个不同int的 s?

更新

也许我应该投反对票。但是我有一个实际的代码,它可以像这样读取和写入可变长度位(不是字节)。

final int unsignedLength = length - 1;

return (((readBoolean() ? ~0 : 0) << (length - 1))
        | readUnsignedInt(length - 1));

我只是很好奇(length - 1)unsignedLength.

谢谢。

4

4 回答 4

3

在此级别上尝试和优化通常完全是矫枉过正,因为它对您的应用程序产生的影响非常小。doSomething1应该是更有效的,因为它不需要计算a - 1两次。然而,这种事情可能会被编译器优化。

不管你应该去,doSomething1因为它更容易维护,即使它有更多的代码,也只有一个地方进行计算a - 1。这使得它不太可能犯错误。

于 2013-05-09T04:42:28.530 回答
1
public void doSomething1(final int a) {
    final int b = a -1;
    doSomethingElse(b);
    doSomethingElse(b);
}

public void doSomething2(final int a) {
    doSomethingElse(a - 1);
    doSomethingElse(a - 1);
}

虽然我相信这不是一个大问题,doSomething1但比doSomething2. 正如您所说,这似乎是一个过早的优化问题。为什么要计算a-1多次?看似微不足道,但这些小事加起来。只要效率比内存分配更重要,那么我相信你会有你的答案。显然,这是一个微不足道的例子,但doSomething1绝对比doSomething2效率方面更可取。

于 2013-05-09T04:40:13.797 回答
1

doSomething1()使用额外变量b,其中 doSomething2() 不会创建额外变量。如果您看到一个点,则 doSomething1()a-1只执行一次操作,但 doSomething2() 执行两次。这是我的想法,但我不确定哪个oen更好。

于 2013-05-09T04:42:23.217 回答
1

doSomething1 比 doSomething2 好吗?

即使在这个简单的示例中,它也稍微好一些,但不是在性能方面,而是在可维护性方面,因为您在多个地方没有重复的代码 (a - 1)。

doSomething2 是否使用两个不同的整数?

不,这两种情况都是一样的

也如前所述,这是过早的优化,不应关注。

在性能方面,我认为即使在最严格的位上也没有任何区别,因为 a 被声明为 final 并且 b 或 a-1 的表达式在编译后将评估为常量。

于 2013-05-09T04:43:20.830 回答