Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replacing Nested if Statement With AND

Tags:

c#

nested-if

I am wondering whether nested if is better than AND statement. I have a loop that goes so many times so I am thinking of faster execution available. Below is the code that has same logic with my code. The nested if statement is inside a loop.

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

Will my code be faster by a significant difference if I replace the nested if with this And STATEMENT?

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

I have read this link but I didn't find the answer. I am a student and still learning, thanks for all the feedback!

like image 591
blenzcoffee Avatar asked Jul 05 '12 19:07

blenzcoffee


2 Answers

No, it will not have a significant difference on performance, but there may be a difference in readability.

Both of those will generate the same IL when compiled with optimization/release(Tested with 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         

Even without optimization the difference is not that significant:

Nested statements:

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 

Not Nested statements:

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 
like image 114
Filip Ekberg Avatar answered Sep 22 '22 19:09

Filip Ekberg


.NET will stop checking if the first part of the conditional is false, so there will be no performance difference between the two.

like image 25
Kyeotic Avatar answered Sep 26 '22 19:09

Kyeotic