`if`条件效率

Mar*_*oun 7 java performance

我正在努力提高Java程序的性能.在我改进了data structures算法的复杂性之后,我正在努力改进实现.我想知道if在条件中如何使用语句真的很重要.

编译器是否将这两个版本视为相同?它们的成本是否相同(如果我在if语句中有更多变量)?

if(a && b && c && d && e && f && g)
Run Code Online (Sandbox Code Playgroud)

要么

if(a)
 if(b)
  if(c)
   if(d)
    if(e)
     if(f)
      if(g)
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*per 22

&&操作者(以及||)是短路在Java中操作.

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

因此,将您的内容编写if为一系列嵌套if语句没有任何好处.

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


And*_*ter 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
Run Code Online (Sandbox Code Playgroud)


Ron*_*ell 6

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

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

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

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