带或不带显式变量的多方法调用

时间:2013-05-09 04:32:17

标签: java

我认为这可能是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是否优于doSomething2doSomething2使用两个不同的int s?

更新

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

final int unsignedLength = length - 1;

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

我只是想用(length - 1)更改unsignedLength部分。

感谢。

4 个答案:

答案 0 :(得分:3)

尝试在这个级别上进行优化通常是完全过度的,因为它将在您的应用程序上产生的差异非常小。 doSomething1应该更有效率,因为它不需要计算a - 1两次。但是,这种事情可能会被编译器优化。

无论你应该选择doSomething1,因为它更容易维护,即使它有更多的代码,只有一个地方可以进行计算a - 1。这样就不太可能犯错误。

答案 1 :(得分: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);
}

虽然我认为这不是一个大问题,doSomething1doSomething2更有效率。正如您所说,这似乎是一个不成熟的优化问题。为什么要多次计算a-1?这似乎微不足道,但这些小事情加起来。只要效率对内存分配更重要,那么你就有了答案,我相信。显然这是一个微不足道的例子,但doSomething1绝对优于doSomething2效率。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

  

doSomething1比doSomething2更好吗?

即使在这个简单的例子中,它稍微好一点,但在性能方面没有好处,但在可维护性方面,因为你在多个地方没有重复的代码(a - 1)。

  

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

两种情况都不一样

同样如上所述它是过早优化而不应该专注于。

在表现方面,我也不认为即使在最高位也没有任何区别,因为a被声明为final,而b或a-1的表达式将在编译后评估为常量。