9

我正在努力提高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)

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

4

3 回答 3

22

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

这意味着 if ais false,Java 不会计算b,cd,因为它已经知道整个表达式a && b && c && d && e && f && g将是false

if因此,将您的编写为一系列嵌套if语句没有任何收获。

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

于 2012-11-29T13:16:59.883 回答
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
于 2012-11-29T13:22:34.107 回答
6

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

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

我将其发布为答案,因为我认为出于优化目的而询问特定语言功能的效率是完全错误的方法,我相信您将从完全不同的策略中受益。

此外,某些实现可能会以不同的方式处理事情,因此除非标准中的某些东西是一成不变的(有时甚至不能保证),否则答案可能取决于实现,并且是有条件的。

于 2012-11-29T13:17:50.887 回答