2012-03-19 76 views
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 2012-03-19 16:48:27

+1

我建議你使用StringBuilder而不是字符串連接。它不會解決所有的性能問題,但它可以幫助 – Jetti 2012-03-19 16:48:47

+0

另外,if(firstrun)在每次迭代中都運行,但僅用於第一次。 – gbianchi 2012-03-19 16:50:00

回答

12

彈出的明顯問題是您的字符串連接。

每次追加到字符串時,實際上都會附加到字符串的副本(因爲字符串單獨是不可變的)。這可能是非常昂貴的。

您應該更喜歡StringBuilder,或者,爲了生成這樣的HTML,您可能需要調查HtmlTextWriter--這將有助於照顧HTML的「格式良好」,以及其他內容。

+1

感謝大家的快速反饋!我會記得從現在開始使用字符串生成器。 – 2012-03-19 17:39:57

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(); 
相關問題