C # + = (плюс равно) (присваивание путем сложения) работает очень медленно, когда строка слишком длинная? - PullRequest
8 голосов
/ 17 ноября 2009

У меня есть цикл for, и я делаю вот что.

forloop ( loop 7000 times)
{
x += 2000_char_long_string;
}

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

Спасибо.

Ответы [ 5 ]

45 голосов
/ 17 ноября 2009

Использование StringBuilder .

StringBuilder sb = new StringBuilder();
for(int i=0; i< 200; i++){
   sb.append(longString);
}
return sb.ToString();

Когда вы используете += для строк, вы продолжаете создавать новые строки и продолжаете размещать все большие и большие блоки памяти. Вот почему операция такая медленная.

14 голосов
/ 17 ноября 2009

Используя StringBuilder, так как @ Kobi ссылается на , вы все равно можете повысить производительность, инициализируя ее. Кажется, вы можете заранее определить окончательный размер string.

StringBuilder sb = new StringBuilder(7000*2000);
for(int i=0; i< 7000; i++){
   sb.append(2000_char_long_string);
}
return sb.ToString();
2 голосов
/ 17 ноября 2009

Струнные манипуляции неизменны. Каждый раз будет создаваться новая строка stmt x + = 2000_char_long_string; выполнен. Следовательно, как рекомендует Коби, вы должны использовать класс StringBuilder.

Однако в вашем случае вы должны указать емкость в конструкторе StringBuilder.

Это потому, что, если не указано, емкость StringBuilder по умолчанию при создании равна 16.

Как только эта емкость будет исчерпана, она создаст новую непрерывную ячейку памяти, скопирует все содержимое StringBuilder в новую ячейку и укажет экземпляр на новую ячейку. Поскольку вы уже знаете о приблизительном размере конечной строки (возможно, 7000 * 2000), вы можете указать емкость соответственно.

Пожалуйста, смотрите мой ответ на StringBuilder и емкость? для более подробной информации.

1 голос
/ 17 ноября 2009

C # строковый объект является неизменным, каждый раз при изменении содержимого создается новый объект и копируется новое содержимое. Вместо этого используйте StringBuilder, он предоставляется для решения проблемы, с которой вы сталкиваетесь

1 голос
/ 17 ноября 2009

Вы должны использовать StringBuilder класс

...