Что быстрее, записать текст в файл или преобразовать в байты и записать его в файл? - PullRequest
2 голосов
/ 14 июля 2009

У меня есть требование записать HTML в файловую систему, и мне было интересно, есть ли какое-либо увеличение скорости преобразования его в байты и записи с использованием FileStream вместо использования File.WriteAllText () (или аналогичного текстового метода) ).

Ответы [ 3 ]

10 голосов
/ 14 июля 2009

Что, по вашему мнению, происходит в File.WriteAllText? В конце концов, это будут байты, попадающие на диск. Этот диск вряд ли будет медленной частью этой цепочки в любом случае. Если бы записываемые данные не были очень большими, я бы не беспокоился об этом, а просто использовал бы реализацию, которая мне показалась наиболее удобной. Если вы хорошо спроектируете код, то в дальнейшем, если потребуется, изменить его будет несущественно.

7 голосов
/ 14 июля 2009

Сначала напишите код, который наиболее читабелен и удобен в обслуживании. Тогда в будущем, если у вас возникнут проблемы с производительностью, поищите горлышко бутылки.

(Я был бы очень удивлен, если горлышко бутылки окажется как-то связано с преобразованием строки в байтовый массив или нет. Горлышко бутылки с чем-то вроде этого будет вашей скоростью записи на диск)

Не оптимизируйте преждевременно .

2 голосов
/ 14 июля 2009

File.WriteAllText использует StreamWriter за кадром:

public static void WriteAllText(string path, string contents, Encoding encoding)
{
    using (StreamWriter writer = new StreamWriter(path, false, encoding))
    {
        writer.Write(contents);
    }
}

У вас уже есть строка, поэтому преобразование ее в байтовый массив было бы бессмысленным, поскольку в любом случае это выполняется внутри метода StreamWriter.Flush с использованием базового класса Encoder . Flush вызывается методом StreamWriter.Dispose , который вызывается предложением using. Это фрагмент от источника Flush через отражатель:

int count = this.encoder.GetBytes(this.charBuffer, 0, this.charPos, this.byteBuffer, 0, flushEncoder);

Вы можете видеть, что у него есть charBuffer. Это просто массив char [], в который он записывает, когда вы выполняете StreamWriter.Write (string) .

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

Если у вас возникают проблемы с преобразованием, используйте Encoding.Unicode в качестве последнего параметра в перегрузке 3 параметров, так как File.WriteAllText (string, string) использует UTF8 без спецификации.

...