我认为这可能是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
部分。
感谢。
答案 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);
}
虽然我认为这不是一个大问题,doSomething1
比doSomething2
更有效率。正如您所说,这似乎是一个不成熟的优化问题。为什么要多次计算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的表达式将在编译后评估为常量。