2009-06-04 13 views
4

ループ内で文字列変数を割り当てる最も効率的な方法は何でしょうか。だから、例えば私は、ループがC#ループ内の文字列に値を割り当てる最も良い方法

string myStringVariable = string.Empty 
foreach(XmlNode node in givenNodes) 
{ 
    myStringVariable = node.Value; 
    .... 
    ... 
} 

のように開始する前に、私は、変数を定義した場合、それは良いだろう、ノードのリストを参照して文字列にノードの値を代入するために持っているか、それが可能ならばより効率的な私は

foreach(XmlNode node in givenNodes) 
{ 
    string myStringVariable = node.Value; 
    .... 
    ... 
} 

のようなループ内で変数を定義する場合、私は、第二は、よりエレガントに見えるしながら、最初のアプローチは、より効率的だと思います。両者のパフォーマンスに違いはありますか?

お返事ありがとうございます。

+0

あなたの質問にソースコード部分を書式設定することができます。それをマークし、 'Ctrl + K'またはコードサンプルボタンを使用します。 – crauscher

答えて

1

いいえ、実際のパフォーマンスの違いはありません。 VMは、1つの追加の変数に対してスタック上の領域を割り当てるだけでよいことを認識します。

13

現代のコンパイラでは、これはパフォーマンスの差異をまったくもたらさず、常にアルゴリズムに最も適した方法を使用する必要があります。つまり、最後の反復から変数の値を必要としない場合は、2番目の変種を使用することをお勧めします。

+0

申し訳ありませんが、実際に正しいようです! (ダウン投票が削除されました)私は常にコンパイラの最適化を忘れる傾向があります... – Noldorin

+0

違反はありません。 –

1

私は通常、このレベルに最適化しません。なぜなら、JITコンパイラは実行時にそのような最適化を実行できると思うからです。それは言われて、私は実際に2つを比較したことはありません。もちろん、最大限のパフォーマンスが本当に必要な場合は、十分な数の反復とリリースビルドを使用して両方の方法でテストする価値があります。

6

私は主な質問は次のとおりです。あなたのコードのどこかでその文字列変数をさらに使用する必要があるのか​​、またはその用途がforループの範囲に限定されているのでしょうか? forループの範囲に限定されている場合は、必ずループの内側に宣言してください。いずれにしてもパフォーマンスが低下するのではないかと疑われますが、変数のスコープを適切に保つためには、それが二次的でなければなりません。

1

コンソールアプリケーションで少しテストを設定してテストしてみませんか? どちらの方法でも非常に近い結果が得られます。

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Diagnostics; 

namespace stringtestloop 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Stopwatch w = new Stopwatch(); 
      int itterations = 1024 * 1024 * 512; 

      w.Start(); 
      string var1 = string.Empty; 
      for (var i = 0; i < itterations; i++) 
      { 
       var1 = "some string"; 
      } 
      w.Stop(); 

      Console.WriteLine("outside: {0} ms", w.ElapsedMilliseconds); 

      w.Reset(); 

      w.Start(); 
      for (var i = 0; i < itterations; i++) 
      { 
       string var2 = "some string"; 
      } 
      w.Stop(); 

      Console.WriteLine("inside: {0} ms", w.ElapsedMilliseconds); 
      Console.ReadKey(); 
     } 
    } 
} 

はEDIT:

次の質問は...自分が依頼する536870912(1024 * 1024 * 512)あなたが行っているものと同様の数はと仕事ができることです。そうでない場合、あなたの数字がずっと少なくなるならば、あなたは本当にその違いに気づかないでしょう。

+0

乾杯グレッグ、 私はあなたのコードを使用してパフォーマンスの違いを参照してください。外に宣言すると、約1500ミリ秒かかります。内部には約2000ミリ秒かかります。 –

+1

ベンチマークであるHamidをもう一度チェックしたいかもしれません。グレッグのように、私は非常に似た結果を得ます。また、このリリースをコンパイルすると、ループ本体が最適化されます。 –

0

どちらの場合も、XmlNode.Valueへの参照を取得しているだけで、新しい文字列を作成していないため、パフォーマンスに大きな違いがあるとは限りません。

しかし、通常は、これらのケースの最適化について心配する必要はありません。変数をスコープ内で宣言し、コンパイラにその魔法を働かせてください。

1

実際には、その文字列は不変であり、.netは参照と連動するため、両方の方法のパフォーマンスに違いはありません。

おそらく、最初のものは少し遅くなります。なぜなら、string.Emptyに1つ(不要な)myStringVariableが存在するからです。しかし、私はこれらの問題がコンパイラとJITによって保持されると思うので、パフォーマンスの場合には両者に違いはありません。

最後に、スコープに違いがあります。したがって、変数が必要な適切なスコープに変数を宣言します。

関連する問題