5

ネストされた if が AND ステートメントよりも優れているかどうか疑問に思っています。何度もループするループがあるので、より高速な実行を利用できるようにすることを考えています。以下は、私のコードと同じロジックを持つコードです。ネストされた if ステートメントがループ内にあります。

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

ネストされた if をこの And STATEMENT に置き換えると、コードは大幅に高速化されますか?

     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 の方が良く、より自然に感じる場合があります。1 つの一般的な例は次のとおりです。

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

null参照例外になります

ご覧のとおり、個別ifの sを使用する場合は、null チェックを最初に行うことを考える方が自然です。

于 2012-07-05T19:29:36.593 に答える
3

.NET は、条件の最初の部分が false であるかどうかのチェックを停止するため、2 つの間にパフォーマンスの違いはありません。

于 2012-07-05T19:30:28.043 に答える
1

コンパイルされたコードでは、速度が異なる必要がある理由はありません。まったく同じアセンブリコードに変換されます。読みやすさの要素については間違いなく同意します。クラスの長さも短くなります。

于 2012-07-05T19:33:00.743 に答える