为什么这个循环如此缓慢
本文关键字:缓慢 循环 为什么 | 更新日期: 2023-09-27 18:28:28
我试图找出这个循环如此缓慢的原因,但我还没有得到一个好的答案。以下循环需要一分钟以上才能执行:
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个键值对。有什么想法吗?
显而易见的问题是字符串连接。
每次附加到字符串时,实际上都是附加到该字符串的副本(因为每个字符串都是不可变的)。这可能非常昂贵。
你应该更喜欢StringBuilder,或者,为了生成这样的HTML,你可能想研究HtmlTextWriter——这将有助于处理HTML的"格式良好"等问题。
尝试使用StringBuilder而不是手动连接字符串。
按照您的操作方式,每次向字符串末尾添加更多内容时都会重新评估字符串,并且每次都会重新构建,这是非常昂贵的。StringBuilder对于这类工作要高效得多。
无论何时追加到字符串,旧字符串都会被销毁,并创建一个新字符串。
所以你放得越多,字符串的凹陷就越慢。
如果你换成StringBuilder,你应该会得到更好的速度。
您是否尝试将字符串类型更改为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();