Что потребляет меньше ресурсов и быстрее File.AppendText или File.WriteAllText хранит сначала в StringBuilder?

Я должен написать тысячи динамически сгенерированных строк в текстовый файл. У меня есть два варианта, который потребляет меньше ресурсов и быстрее, чем другой?

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

StringBuilder sb = new StringBuilder(); foreach(Data dataItem in Datas) { sb.AppendLine( String.Format( "{0}, {1}-{2}", dataItem.Property1, dataItem.Property2, dataItem.Property3)); } File.WriteAllText("C:\\example.txt", sb.ToString(), new UTF8Encoding(false)); 

B. Использование File.AppendText

 using(StreamWriter sw = File.AppendText("C:\\example.txt")) { foreach (Data dataItem in Datas) { sw.WriteLine( String.Format( "{0}, {1}-{2}", dataItem.Property1, dataItem.Property2, dataItem.Property3)); } } 

Ваша первая версия, которая помещает все в StringBuilder а затем записывает ее, будет потреблять большую часть памяти. Если текст очень большой, у вас может быть нехватка памяти. Он может быть быстрее, но он также может быть медленнее.

Второй вариант будет использовать гораздо меньше памяти (в основном, только буфер StreamWriter ) и будет работать очень хорошо. Я бы рекомендовал этот вариант. Он работает хорошо – возможно, лучше, чем первый метод – и не имеет такого же потенциала для исчерпания памяти.

Вы можете значительно ускорить его, увеличив размер выходного буфера. Скорее, чем

 File.AppendText("filename") 

Создайте stream с помощью:

 const int BufferSize = 65536; // 64 Kilobytes StreamWriter sw = new StreamWriter("filename", true, Encoding.UTF8, BufferSize); 

Размер буфера 64K дает гораздо лучшую производительность, чем размер буфера по умолчанию 4K. Вы можете пойти больше, но я обнаружил, что больше, чем 64K, дает минимальный прирост производительности, а на некоторых системах может фактически снизить производительность.

У вас есть хотя бы один другой выбор, используя File.AppendAllLines()

 var data = from item in Datas select string.Format("{0}, {1}-{2}", item.Property1, item.Property2, item.Property3); File.AppendAllLines("Filename", data, new UTF8Encoding(false)); 

Это теоретически будет использовать меньше памяти, чем ваш первый подход, поскольку только одна строка за раз буферизуется в памяти.

Это, вероятно, будет почти точно таким же, как ваш второй подход. Я просто покажу вам третий вариант. Единственное преимущество этого состоит в том, что вы можете подавать ему последовательность Linq, которая иногда может быть полезна.

Скорость ввода-вывода будет затмевать любые другие соображения, поэтому вам следует сконцентрироваться на минимизации использования памяти, как отмечалось выше, а также с учетом опасностей преждевременной оптимизации!

Это означает использование вашего второго подхода или того, который я здесь привел.