`if`条件效率

我正致力于提高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) 

在这个特定的项目中我并不关心可读性,我知道第二个不太可读

&&运算符(以及|| )是Java中的短路运算符。

这意味着如果afalse ,Java不会评估bcd等,因为它已经知道整个表达式a && b && c && d && e && f && g将是false

因此,将if作为一系列嵌套if语句编写是没有任何好处的。

优化性能的唯一好方法是使用分析器测量程序的性能,确定实际性能瓶颈的位置,并尝试改进代码的这一部分。 通过检查代码和猜测进行优化,然后应用微优化通常不是一种有效的优化方法。

除了其他答案之外,即使在非常低的级别上,两种方法之间也没有区别 – 它们被编译成相同的字节码:

 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 

在分析用任何语言编写的程序时,不要只关注语言结构,而要关注代码的作用。 为你的代码计时,找出花费的时间,然后你会知道原因是什么,因为它会缩小。

如果您知道程序的缓慢部分在if语句中,那么您已经知道问题的答案。

我发布这个作为答案,因为我认为为优化目的询问特定语言function的效率完全是错误的方法,我相信你会受益于一个非常不同的策略。

此外,某些实现可能会稍微不同地处理事情,因此除非标准中存在某些内容(有时甚至不能保证),否则答案可能依赖于实现,并且是有条件的。