Одна вещь, которую нужно проверить, это то, что вы передаете StringBuilder столько, сколько возможно, вместо того, чтобы создавать новый, а затем возвращать его ToString () без необходимости.
Гораздо больший выигрыш можно получить, еслиВы обрабатываете данные как строки меньшего размера, читаемые из потока.Конечно, это зависит только от того, какие манипуляции вы делаете, но, если это вообще возможно, прочитайте ваши данные из StreamReader (или аналогичного в зависимости от источника) небольшими порциями, а затем запишите их в StreamWriter.
Часто изменения применяются только в пределах заданной строки текста, что делает следующий шаблон незамедлительно полезным:
using(StreamReader sr = new StreamReader(sourceInfo))
using(StreamWriter sw = new StreamWriter(destInfo))
for(string line = sr.ReadLine(); line != null; line = sr.ReadLine())
sw.WriteLine(ManipulateString(line));
В других случаях, когда это не применяется, все еще есть способы разбить строку на частиподлежит обработке.