Что быстрее, записать текст в файл или преобразовать в байты и записать его в файл?

2

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

  • 7
    Попробуйте и посмотрите.
  • 0
    Совсем не полезно, но спасибо.
Показать ещё 1 комментарий
Теги:
text
byte

3 ответа

2
Лучший ответ

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, который вызывает предложение use. Это фрагмент из источника Flush через отражатель:

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

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

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

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

  • 0
    Спасибо, что действительно ответили на вопрос. Все остальные, примите это к сведению и следуйте его указаниям. Делать заявления, которые не имеют никакого отношения к актуальному вопросу, бессмысленно и просто мешает.
10

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

  • 0
    У меня нет горлышка бутылки, мне просто интересно, так как процессор чувствителен ко времени, который мы пытаемся сэкономить во всех возможных областях. Спасибо за ваш ответ, хотя.
7

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

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

Не оптимизировать преждевременно.

  • 0
    +1. Сначала заставьте это работать, перепроектируйте в случае необходимости и затем точно настройте это.
  • 0
    Я предполагаю, что он спрашивает, потому что он заставил это работать и теперь перепроектирует. Также этот ответ противоречит первому! Запись на диск обходится дорого, но две копии строки в памяти не очень хорошая идея для серверного приложения.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню