为什么这个循环这么慢?

时间:2012-03-19 16:47:03

标签: c# performance loops

我试图查找为什么这个循环如此缓慢的原因,但我还没有得到一个好的答案。以下循环需要一分钟才能执行:

        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个键值对。有什么想法吗?

4 个答案:

答案 0 :(得分:12)

弹出的明显问题是你的字符串连接。

每次附加到字符串时,实际上都是附加到字符串的副本(因为字符串各自是不可变的)。这可能是非常昂贵的。

您应该更喜欢StringBuilder,或者,为了生成这样的HTML,您可能需要调查HtmlTextWriter - 这将有助于处理“格式良好”的问题。 HTML等等。

答案 1 :(得分:4)

尝试使用StringBuilder而不是手动连接字符串。

你这样做的方式,每次你添加更多的字符串并每次重建时都会重新评估字符串,这很昂贵。 StringBuilder对于这类工作来说效率要高得多。

答案 2 :(得分:3)

无论何时附加到字符串,旧的字符串都会被销毁,会创建一个新字符串。

所以字符串连接越慢越慢。

如果换掉StringBuilder,你的速度会更快。

答案 3 :(得分: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();