Производительность методов System.IO.ReadAllxxx / WriteAllxxx

Есть ли сравнение производительности методов System.IO.File.ReadAllxxx / WriteAllxxx с классами StreamReader / StremWriter, доступными в Интернете. Как вы думаете, лучший способ (с точки зрения производительности) читать / писать текстовые файлы в .net 3.0?

Когда я проверил Страница MSDN класса System.IO.File, в примере кода MS использует StreamReader / StreamWriter для файловых операций. Есть ли какая-то конкретная причина избегать методов File.ReadAllxxx / WriteAllxxx, даже если они выглядят намного проще для понимания?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
970
7

Ответы 7

File.ReadAllText и аналогичные методы используют StreamReader / Writers внутри, поэтому производительность должна быть сопоставима с тем, что вы делаете сами.

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

Большое спасибо за ответ. Я тоже думал в том же духе. Но запутался, когда увидел страницу MSDN, о которой упоминал в своем вопросе.

Vijesh VP 03.10.2008 17:02

@ Фредрик Калсет прав. Методы File.ReadXXX - это просто удобные оболочки для класса StreamReader.

Например, вот реализация File.ReadAllText

public static string ReadAllText(string path, Encoding encoding)
{
    using (StreamReader reader = new StreamReader(path, encoding))
    {
        return reader.ReadToEnd();
    }
}

Вероятно, вы не захотите использовать File.ReadAllxxx / WriteAllxxx, если у вас есть какие-либо намерения поддерживать загрузку / сохранение действительно больших файлов.

Другими словами, для редактора, который вы собираетесь использовать при редактировании файлов размера гигабайт, вам нужен какой-то дизайн с StreamReader / StreamWriter и поиском, чтобы вы загружали только ту часть файла, которая видна.

Для всего без этих (редких) требований я бы посоветовал выбрать простой путь и использовать File.ReadAllxxx / WriteAllxxx. Они просто используют тот же шаблон StreamReader / Writer внутри, как и вы, в любом случае, кодируете вручную, как показывает aku.

Если вы не делаете что-то вроде применения регулярного выражения, которое соответствует многострочному текстовому файлу, вы обычно не хотите использовать ReadAll / WriteAll. Работа с более мелкими и более управляемыми фрагментами почти всегда приводит к повышению производительности.

Например, чтение таблицы из базы данных и отправка ее в веб-браузер клиента должны выполняться небольшими наборами, которые используют природу небольших сетевых сообщений и уменьшают использование памяти обрабатывающего компьютера. Нет смысла буферизовать 10 000 записей в памяти на веб-сервере и выгружать их все сразу. То же самое и с файловыми системами. Если вас беспокоит производительность записи большого количества небольших объемов данных - например, что происходит в базовой файловой системе для выделения пространства и какие накладные расходы - вы можете найти эти статьи поучительными:

Использование кэша файлов Windows

Тесты чтения файлов

Уточнение: если вы выполняете ReadAll, за которым следует String.Split ('\ r'), чтобы получить массив всех строк в файле, и использование цикла for для обработки каждой строки этого кода, что обычно приводит к ухудшению производительности, чем чтение файла построчно и выполнение вашего процесса на каждой строке. Это не жесткое правило - если у вас есть некоторая обработка, которая занимает большой промежуток времени, часто лучше освободить системные ресурсы (дескриптор файла) раньше, чем позже. Однако, что касается записи файлов, почти всегда лучше выгружать результаты любого процесса преобразования (например, вызова ToString () для большого списка элементов) для каждого элемента, чем буферизовать его в памяти.

Другие объяснили производительность, поэтому я не буду добавлять ее, однако добавлю, что вполне вероятно, что образец кода MSDN был написан до .NET 2.0, когда вспомогательные методы были недоступны.

@ Ричард Я тоже так думал. Я просто хотел подтвердить, что ничего здесь не упускаю. спасибо за Ваш ответ.

Vijesh VP 03.10.2008 17:04

Эта ссылка содержит тесты для чтения 50 + K строк и указывает на то, что программа для чтения потокового видео работает примерно на 40% быстрее.

http://dotnetperls.com/Content/File-Handling.aspx

Этот документ MSR (Microsoft Research) - хорошее начало, он также документирует ряд точечных инструментов, таких как IOSpeed, FragDisk и т. д., Которые вы можете использовать и тестировать в своей среде.

Существует также отчет / презентация обновлено, в котором вы можете прочитать о том, как максимально увеличить количество последовательных операций ввода-вывода. Очень интересные вещи, поскольку они развенчивают миф о том, что «перемещение головки HD - это наиболее трудоемкая операция», они также полностью документируют свои тестовые среды и связанные конфигурации, вплоть до материнской платы, контроллера рейда и практически любой актуальной информации, чтобы вы могли воспроизвести их Работа. Некоторые из основных моментов - это то, как Opteron / XEON соответствовали друг другу, но затем они также сравнили их с безумным \ хайповым NEC Itanium (32 или 64 процесса или что-то в этом роде) для измерения. По второй ссылке вы можете найти гораздо больше ресурсов о том, как тестировать и оценивать сценарии и потребности с высокой пропускной способностью.

Некоторые из других статей MSR по этой же теме исследования включают рекомендации о том, где максимизировать ваши расходы (например, RAM, CPU, Disk Spindals ... и т. д.), Чтобы согласовать ваши шаблоны использования ... все очень аккуратно.

Однако некоторые из них устарели, но обычно старые API в любом случае являются более быстрыми / низкоуровневыми;)

В настоящее время я отправляю сотни тысяч TPS на специально созданный сервер приложений, используя сочетание C#, C++ / CLI, собственного кода и кэширования растровых изображений (rtl * bitmap).

Заботиться;

Другие вопросы по теме