`if`条件效率

时间:2012-11-29 13:14:34

标签: java performance

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

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

3 个答案:

答案 0 :(得分:22)

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

这意味着,如果afalse,则Java不评估bcd等,因为它已经知道整个表达式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语句中,那么您已经知道问题的答案。

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

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