Почему этот цикл такой медленный? - PullRequest
1 голос
/ 19 марта 2012

Я пытался найти причину, почему этот цикл такой медленный, но я пока не получил хорошего ответа.Выполнение следующего цикла занимает более минуты:

        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 является списком и содержит около 1150 словарей.Каждый словарь содержит 9 пар ключевых значений.Есть мысли?

Ответы [ 4 ]

12 голосов
/ 19 марта 2012

Очевидная проблема, которая возникает, - это конкатенация строк.

Каждый раз, когда вы добавляете строку, вы фактически добавляете копию строки (поскольку строки по отдельности являются неизменяемыми).Это может быть очень дорого.

Вы должны предпочесть либо StringBuilder , либо, для генерации HTML-кода, подобного этому, вы можете изучить HtmlTextWriter - это поможет позаботиться о "колодце"«сформированность» HTML среди прочего.

4 голосов
/ 19 марта 2012

Попытка использовать StringBuilder вместо ручного объединения строк.

Как вы это делаете, строка переоценивается каждый раз, когда вы добавляете больше в конец, и перестраивается каждый раз, что дорого. StringBuilder намного более эффективен для этого типа работы.

3 голосов
/ 19 марта 2012

Каждый раз, когда вы добавляете строку, старая уничтожается, создается новая строка.

Таким образом, конкатенация строк становится медленнее и медленнее, чем больше вы кладете его.

Если вы обменяетесь на StringBuilder, вы должны получить намного лучшую скорость.

1 голос
/ 19 марта 2012

Вы пытались изменить тип строки на 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...