5

我想知道嵌套 if 是否比 AND 语句更好。我有一个循环很多次,所以我正在考虑更快的执行。下面是与我的代码具有相同逻辑的代码。嵌套的 if 语句位于循环内。

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

如果我用这个 And STATEMENT 替换嵌套的 if,我的代码会更快吗?

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

我已阅读此链接,但没有找到答案。我是学生,还在学习中,谢谢大家的反馈!

4

4 回答 4

9

不,它在性能上不会有显着差异,在可读性上可能会有差异。

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 
于 2012-07-05T19:28:56.790 回答
3

不,两者之间不会有任何区别。但是,AND 减少了行数并且更具可读性(如果您没有那么多条件)

在某些情况下ifs 更好,感觉更自然,一个常见的例子如下:

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可以看到,在使用单独的 s时想到先做空检查比较自然

于 2012-07-05T19:29:36.593 回答
3

.NET 将停止检查条件的第一部分是否为假,因此两者之间不会有性能差异。

于 2012-07-05T19:30:28.043 回答
1

在编译代码中,速度没有理由不同,它们将转换为完全相同的汇编代码。我绝对同意可读性因素,它也会缩短你的课程长度。

于 2012-07-05T19:33:00.743 回答