假设我有一个名为num
的数字,如果某个条件A发生,那么将数字增加1,否则减少它。
我可以写这样的代码:
if (A) ++num;
else --num;
这段代码也可以在没有任何if-else的情况下编写,但会涉及更多的算术(只是简单的基本算术,没有指数,对数或任何需要科学计算器的东西!) 像这样:
num = num * x + y;
问题是,第一个或第二个代码块的执行速度会更快吗? (这是Java,顺便说一下。)
(请不要说它没有任何区别。这只是我试图做的非常'基本'版本。但是假设有一个非常好的分析器可以衡量运行时间之间的差异这两个,哪一个会更快?)
由于
答案 0 :(得分:4)
这些优化在大多数情况下并没有多大意义,尤其是在Java虚拟机中,它们具有JIT并优化字节码。
尽可能保持代码的可读性,不要担心这种优化......
答案 1 :(得分:3)
答案是,它取决于上下文,以及JIT编译器在您的平台上优化代码的能力。
它可能不会对您的申请表现产生显着影响。
即使它确实如此,我们无法预测它会产生什么差异,因为它将取决于您的平台(例如,您正在使用的特定JVM /版本)以及周围的代码。
最好的建议是编写代码,以便为优化器提供最佳的工作机会。然后,如果需要考虑性能,请分析您的应用程序并查看热点的位置,并优化热点。如果探查器说它是一个热点,则只优化此代码。
答案 2 :(得分:1)
分支的成本比算术指令高10倍或更高是没有价值的。当重复使用分支的同一侧时,处理器可以将成本降低到几乎为零,但是当分支的一侧改变时,这可能花费大约100个时钟周期。 (给定一个++或 - 可能只是一个时钟周期,这很重要)