2012-11-29 34 views
7

我正在努力提高Java程序的性能。 在我改进了data structures和算法的复杂性之后,我试图改进实现。我想知道在条件下如何使用if声明真的很重要。`if`条件效率

编译器对待这两个版本是否相同?他们的费用是否相同(如果我在if声明中有更多变量)?

if(a && b && c && d && e && f && g) 

OR

if(a) 
if(b) 
    if(c) 
    if(d) 
    if(e) 
    if(f) 
     if(g) 

在这个特定的项目,我真的不关心的可读性,我知道二是少可读

+1

你到编译器的优化问题,甚至在此之前,第二个版本肯定不太可读。 – adarshr

+0

你是对的,但在这个特定的项目中,我关心的不是可读性,我只是想使用更高效的实现,因为在这种情况下对我来说非常关键。 – Maroun

+0

看这[回答](http://stackoverflow.com/questions/13621324/are-variable-definitions-that-are-used-once-optimized/13621403#13621403)。它可以转移到你的案件。 – jlordo

回答

22

&&运营商(和也是||)是一个short-circuit运算符在Java中。

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

因此,将if作为一系列嵌套的if语句来写没有什么可以获得的。

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

+0

您的意思是“||”吗?因为如果'a'是'true',Java会继续评估'a && b && c && d && e && f && g1'。如果'a'为'false',那么它知道'&& b && c && d && e && f && g1'将是错误的。 –

+0

@ TheCat编辑。 – Jesper

6

分析用任何语言编写的程序时,请不要关注语言结构,而应关注代码的功能。记下你的代码,找出时间花在哪里,然后你就会知道原因是什么,因为它会被缩小。

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

我发布这个作为答案,因为我相信询问有关特定语言功能的优化目的的效率完全是错误的方法,我相信你会从一个非常不同的策略中受益。另外,某些实现可能会有些不同,所以除非有某些东西在标准中被设置(并且有时甚至不能保证),否则答案可能取决于实现,也可能有条件。

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