更换嵌套if语句和(Replacing Nested if Statement With AND)

2019-09-19 03:51发布

我想知道是否嵌套,如果是比AND语句更好。 我有一个循环,去了很多次,所以我想获得更快的执行。 下面是具有相同的逻辑与我的代码。 嵌套if语句是一个循环中。

   for ( int i = 0; i < array.length; i++)
   {
      // do stuff
      if (x == 5)
      {
         if (y == 3)
         {
             // do stuff
         }
      }
   }  

请问我的代码会更快被显著区别,如果我替换的嵌套,如果这个和语句?

     if ((x == 5) && (y == 3))
           // do stuff

我看了这个链接 ,但我没有找到答案。 我是一名学生,还在学习,感谢所有的反馈!

Answer 1:

.NET将停止检查,如果有条件的第一部分是假的,所以会有两者之间没有性能差异。



Answer 2:

不,这不会对性能有显著差异, 但也有可能是可读性差。

这两个会产生相同的IL当与优化/释放(与LINQPad测试)编译:

IL_0000:  ldc.i4.5    
IL_0001:  stloc.0     
IL_0002:  ldc.i4.s    0A 
IL_0004:  stloc.1     
IL_0005:  ldloc.0     
IL_0006:  ldc.i4.5    
IL_0007:  bne.un.s    IL_000D
IL_0009:  ldloc.1     
IL_000A:  ldc.i4.3    
IL_000B:  pop         

即使没有优化的差距并不显著:

嵌套的语句:

IL_0001:  ldc.i4.5    
IL_0002:  stloc.0     
IL_0003:  ldc.i4.s    0A 
IL_0005:  stloc.1     
IL_0006:  ldloc.0     
IL_0007:  ldc.i4.5    
IL_0008:  ceq         
IL_000A:  ldc.i4.0    
IL_000B:  ceq         
IL_000D:  stloc.2     
IL_000E:  ldloc.2     
IL_000F:  brtrue.s    IL_0020
IL_0011:  nop         
IL_0012:  ldloc.1     
IL_0013:  ldc.i4.3    
IL_0014:  ceq         
IL_0016:  ldc.i4.0    
IL_0017:  ceq         
IL_0019:  stloc.2     
IL_001A:  ldloc.2     
IL_001B:  brtrue.s    IL_001F
IL_001D:  nop         
IL_001E:  nop 

没有嵌套语句:

IL_0001:  ldc.i4.5    
IL_0002:  stloc.0     
IL_0003:  ldc.i4.s    0A 
IL_0005:  stloc.1     
IL_0006:  ldloc.0     
IL_0007:  ldc.i4.5    
IL_0008:  bne.un.s    IL_0013
IL_000A:  ldloc.1     
IL_000B:  ldc.i4.3    
IL_000C:  ceq         
IL_000E:  ldc.i4.0    
IL_000F:  ceq         
IL_0011:  br.s        IL_0014
IL_0013:  ldc.i4.1    
IL_0014:  nop         
IL_0015:  stloc.2     
IL_0016:  ldloc.2     
IL_0017:  brtrue.s    IL_001B
IL_0019:  nop 


Answer 3:

不,不会有任何两者之间的区别。 然而,并使行较少,更可读的(如果你没有那么多的条件)

在有些情况下的情况下if s为更好,感觉更自然,一个常见的例子如下:

String s=//...
if(s==null)return;
if(s.Length > 0) //do something

随着AND,这可以被替换为:

if ((s!=null) && (s.Length > 0)) //Dosomething

许多开发商做这样的错误:

if ((s.Length > 0) && (s!=null) ) //Dosomething

这将在一个空引用异常结束

正如你所看到的,它是更自然的使用单独的时,首先想到做无效的检查if小号



Answer 4:

在编译的代码,没有任何理由的速度应该是不同的,他们将转化为完全一样的汇编代码。 我绝对同意关于可读性的因素,它会缩短你的类的长度为好。



文章来源: Replacing Nested if Statement With AND
标签: c# nested-if