2016-12-01 6 views
7

における条件のためのループ変数宣言のために今すぐ.NETソースコード

for (int i = 0, n = nodes.Count; i < n; i++) 
{ 
    Expression node = Visit(nodes[i]); 
    if (newNodes != null) 
    { 
     newNodes[i] = node; 
    } 
    else if (!object.ReferenceEquals(node, nodes[i])) 
    { 
     newNodes = new Expression[n]; 
     for (int j = 0; j < i; j++) 
     { 
      newNodes[j] = nodes[j]; 
     } 
     newNodes[i] = node; 
    } 
} 

はつまり、なぜ、特定の理由があり、私は.NETExpressionVisitorを掘りしてきたと私はこのforループを見つけました:i = 0, n = nodes.Count; i < nは?

i = 0; i < nodes.Countにはないパフォーマンス向上はありますか?

+1

このループではnも使用されており、ノードのカウントは最初の1回だけカウントされ、各繰り返しではカウントされません。これが良い方法だと思います。 –

答えて

11

同じステートメントを複数回使用する場合は、変数を使用することをお勧めします。

ここでは、nodes.Countは以下の2箇所で使用されているため、同じ文を2回実行する代わりに変数を使用しています。

for (int i = 0, n = nodes.Count; i < n; i++) { 

そして、

newNodes = new Expression[n]; 

注:コメント欄で論じたように、パフォーマンスの差がが完全に無視することができます。

+0

あなたが間違っているわけではないが、この場合のパフォーマンスの差は完全に無視できるような気がする。 – Abion47

+3

@ Abion47それはCountプロパティで何が起こっているかによって異なります。各呼び出しの要素を無視することはできませんが、プロパティが計算されたグローバル変数を返した場合、オブジェクトの作成時のカウントは無視できます。たとえば、リストをカウントすると問題はありません。 – mybirthname

+0

@ Abion47はい、あなたは正しいです:-)。それはコードのベストプラクティスですので、ノードの名前を変更すると、Visual Studioがこれを行いますが、複数の場所で名前を変更する必要はありません。場合は、 'GitHub'や' BitBucket'のようなソースコントロールで直接編集するとどうなりますか? – Aruna

2

この場合、パフォーマンスに大きな影響はないと思います。しかし、そう

newNodes = new Expression[n];

、彼らはこのnを使用していることも、このラインであるとして、

  • プログラムは一度だけnode.Countを取得する必要があります。
  • nを再度割り当てる必要はありません。
  • もっときれいに見えます。

これだけです。

+0

ループの各繰り返しで計算するのではなく、node.countを1回計算すると、どのようなパフォーマンス効果がありませんか? –

+0

これは初期条件であり、一度だけ実行されます。各ループに対して 'i = 0'を設定しません。 – Prajwal

+0

私はそれを知り、それを言った。あなたが言ったように、私はそれがパフォーマンス上の効果を持っているとは思わない。ループがi = 0のみで記述されている場合は、各反復で計算する代わりに、カウントが1回だけ計算されるパフォーマンス効果です。私

関連する問題