TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #1168 1.39K
День девятьсот пятьдесят первый. #ЧтоНовенького
Улучшения Работы с Файлами в .NET 6
В .NET 6 класс FileStream станет намного быстрее и надёжнее благодаря тому, что его почти полностью переписали. Также улучшены функций ввода-вывода: одновременное чтение и запись, сбор статистики и представлены новые API для них.

Поиск и позиция в файле
Узкие места производительности в методах FileStream.ReadAsync() и FileStream.WriteAsync() были вызваны тем фактом, что, когда FileStream открыт для асинхронного ввода-вывода, он синхронизировал смещение файла с Windows для каждой асинхронной операции. Решено перестать это делать, отслеживать смещение только в памяти и использовать системные вызовы, с явным указанием смещения файла. Это сделано как для Windows, так и для Unix. Это привело к улучшению производительности от 10 до 100 раз в Windows и около 25 раз в Unix.

Length
Кэширование значения FileStream.Length при открытии файла только для чтения приводит к почти мгновенному возврату значения из памяти после первого вызова в Windows. Для Unix нет гарантии, что файл не будет изменён кем-то другим во время чтения, поэтому там эта оптимизация не применяется.

WriteAsync
По советам сообщества, для Windows была переделана логика вызова функции WriteFile, которая больше не предполагает увеличения размера файла перед вызовом (WriteFile способна делать это автоматически). Кроме того, снижено потребление памяти за счёт использования ValueTask. Это позволило ускорить производительность в отдельных случаях до 5 раз, и на порядок уменьшить размер потребляемой памяти. В Unix скорость работы не сильно изменилась, но потребление памяти также удалось значительно снизить.

ReadAsync
Как упоминалось выше, удалось сократить количество системных вызовов для определения позиции в файле, поэтому даже для файлов, открытых со способом доступа ReadWrite, скорость чтения увеличилась до 2,5 раз. И, аналогично WriteAsync, за счёт использования ValueTask объём потребляемой памяти, особенно при работе с большими файлами, сократился на несколько порядков.

Read и Write
Синхронные операции чтения и записи уже были практически в оптимальном состоянии. Для Windows изменили их работу, отказавшись от использования потока из пула и заменив его на выделение объекта EventWaitHandle. Таким образом удалось сократить скорость и потребление памяти на 30-50%.

Потокобезопасный ввод-вывод
Чтобы сделать это возможным, в .NET 6 Preview 7 представлены API, принимающие смещение в файле, и не сохраняющие состояние (класс System.IO.RandomAccess).

Используя API, запрашивающее смещение файла, можно использовать системные вызовы на основе смещения (pread()|pwrite() в Unix, ReadFile()|WriteFile() в Windows), которые не изменяют текущее смещение для данного дескриптора файла. Это позволяет выполнять потокобезопасные операции чтения и записи. Пример использования:
async Task ThreadSafeAsync(
string path,
IReadOnlyList<ReadOnlyMemory<byte>> buffers)
{
// новый API (preview 6)
using SafeFileHandle handle =
File.OpenHandle(
path, FileMode.Create, FileAccess.Write,
FileShare.None, FileOptions.Asynchronous);

long offset = 0;
for (int i = 0; i < buffers.Count; i++)
{
// новый API (preview 7)
await RandomAccess.WriteAsync(
handle, buffers[i], offset
);
offset += buffers[i].Length;
}
}
Примечание: Новые API не поддерживают каналы и сокеты, поскольку в них отсутствует концепция смещения (позиции).

Источники: https://devblogs.microsoft.com/dotnet/file-io-improvements-in-dotnet-6
More from @netdeveloperdiary
  1. Oct 16, 2026День 2816. #Карьера #AI Станет ли ИИ-Кодинг Концом Программирования для Людей? Автор ориги…
  2. Oct 15, 2026Post #3374
  3. Oct 14, 2026Post #3373
  4. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  5. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  6. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →