我正致力于提高Java
计划的效果。
在我改进了data structures
和算法的复杂性之后,我正在尝试改进实现。我想知道在条件中如何使用if
语句真的很重要。
编译器是否将这两个版本视为相同?它们的成本是否相同(如果我在if
语句中有更多变量)?
if(a && b && c && d && e && f && g)
或
if(a)
if(b)
if(c)
if(d)
if(e)
if(f)
if(g)
(在这个特定的项目中我并不关心可读性,我知道第二个不太可读)
答案 0 :(得分:22)
&&
运算符(以及||
)是Java中的短路运算符。
这意味着,如果a
为false
,则Java不评估b
,c
,d
等,因为它已经知道整个表达式a && b && c && d && e && f && g
将为false
。
因此,将if
作为一系列嵌套if
语句编写,无法获得任何好处。
优化性能的唯一好方法是使用分析器测量程序的性能,确定实际性能瓶颈的位置,并尝试改进代码的这一部分。通过检查代码和猜测进行优化,然后应用微优化通常不是一种有效的优化方法。
答案 1 :(得分:10)
除了其他答案之外,即使在非常低的水平上,两种方法之间也没有区别 - 它们被编译成相同的字节码:
boolean a=true, b=true, c=true, d=true, e=true, f=true, g=true;
0: iconst_1
1: istore_1
2: iconst_1
3: istore_2
4: iconst_1
5: istore_3
6: iconst_1
7: istore 4
9: iconst_1
10: istore 5
12: iconst_1
13: istore 6
15: iconst_1
16: istore 7
if(a && b && c && d && e && f && g) {}
18: iload_1
19: ifeq 45
22: iload_2
23: ifeq 45
26: iload_3
27: ifeq 45
30: iload 4
32: ifeq 45
35: iload 5
37: ifeq 45
40: iload 6
42: ifeq 45
if(a) if(b) if(c) if(d) if(e) if(f) if(g) {}
45: iload_1
46: ifeq 72
49: iload_2
50: ifeq 72
53: iload_3
54: ifeq 72
57: iload 4
59: ifeq 72
62: iload 5
64: ifeq 72
67: iload 6
69: ifeq 72
答案 2 :(得分:6)
在分析用任何语言编写的程序时,不要只关注语言结构,而要关注代码的作用。为你的代码计时,找出花费的时间,然后你会知道原因是什么,因为它会缩小。
如果您知道程序的缓慢部分在if语句中,那么您已经知道问题的答案。
我发布这个作为答案,因为我认为为优化目的询问特定语言功能的效率完全是错误的方法,我相信你会从一个非常不同的策略中受益。
此外,某些实现可能会稍微处理不同的事情,因此除非标准中存在某些内容(有时甚至不能保证),否则答案可能是依赖于实现的,并且是有条件的。