2012-03-19 14 views
1

私はなぜこのループがとても遅いのかの理由を調べようとしましたが、まだ良い答えは得られていません。次のループは、実行に1分以上かかります。なぜこのループは遅いのですか?

 string answer = ""; 
     string headers = ""; 
     string datarows = ""; 
     bool firstRun = true; 
     foreach (Dictionary<string, string> row in JSON) 
     { 
      datarows += "<tr>"; 
      foreach (KeyValuePair<String, String> cell in row) 
      { 
       if (firstRun) { headers += "<th>" + cell.Key + "</th>"; } 
       datarows += "<td>" + cell.Value + "</td>"; 
      } 
      datarows += "</tr>"; 
      firstRun = false; 
     } 
     answer += "<table><tr>" + headers + "</tr>" + datarows + "</table>"; 
     return answer; 

JSON変数はListであり、約1150の辞書が含まれています。各辞書には、9つのキー値ペアが含まれています。何かご意見は?

+8

あなたはStringBuilderのに役立ちますかどうかを試したことがありますか? – harold

+1

文字列連結の代わりにStringBuilderを使用することをお勧めします。それはすべてのパフォーマンスの問題を解決することはできませんが、それは助けることができます – Jetti

+0

また、すべての反復でif(firstrun)が実行されていますが、最初のものでのみ使用されます.. – gbianchi

答えて

12

明白な問題は、文字列の連結です。

文字列に追加するたびに、実際には文字列のコピーに追加されます(文字列は個別に不変です)。これは非常にコストがかかることがあります。

StringBuilderのどちらかを選択するか、このようなHTMLを生成するには、HtmlTextWriterを調べることをお勧めします。これは、他のものの中でもHTMLの「整形式」を世話するのに役立ちます。

+1

クイックフィードバックをお寄せいただきありがとうございます。私は今からストリングビルダーを使用することを忘れないでしょう。 –

4

文字列を手動で連結する代わりにStringBuilderを使用して試してみてください。

あなたがやっているやり方は、文字列を最後まで追加して毎回再構築するたびに再評価されるため、コストがかかります。 StringBuilderは、このタイプの作業にはるかに効率的です。

3

文字列に追加するたびに、古い文字列が破棄され、新しい文字列が作成されます。

文字列の連結が遅くなり、挿入するほど遅くなります。

StringBuilderをスワップする場合は、はるかに高速化する必要があります。

1

文字列型を連結する必要があるStringBuilderに変更してみましたか?

http://www.dotnetperls.com/stringbuilder-performance

StringBuilder answer = new StringBuilder(); 
StringBuilder headers = new StringBuilder(); 
StringBuilder datarows = new StringBuilder(); 
bool firstRun = true; 
foreach (Dictionary<string, string> row in JSON) 
{ 
    datarows .Apeend("<tr>"); 
    foreach (KeyValuePair<String, String> cell in row) 
    { 
     if (firstRun) { headers.Apeend("<th>" + cell.Key + "</th>"); } 
     datarows.Append("<td>" + cell.Value + "</td>"); 
    } 
    datarows.Append("</tr>"); 
    firstRun = false; 
} 
answer.Append("<table><tr>" + headers + "</tr>" + datarows + "</table>"); 
return answer.toString(); 
関連する問題