Производительность FileStream'а
От: syomin  
Дата: 20.07.15 07:31
Оценка:
Всем привет!

Достаточно большой файл (~1 Гб) читается блоками фиксированного размера (38 байт). Внутри файла блоки следуют друг за другом, но читаются в произвольном порядке. Каждый блок читается один и только один раз. Обработка блока в программе очень простая и занимает минимальное время.

Работа с файлом происходит напрямую через FileStream. Создание объекта выполняется так:
var stream = new FileStream(path, FileMode.Open, FileAccess.Read,
                FileShare.Read, _buffer.Length, FileOptions.RandomAccess);

Явное указание размера блока и опции FileOptions.RandomAccess существенно ускорило обработку файла.

Чтение блока происходит так:
stream.Seek(position * 38, SeekOrigin.Begin);
var _buffer = new byte[38];
var n = stream.Read(_buffer, 0, _buffer.Length);


В моём представлении, узким местом, определяющим скорость обработки, является дисковая подсистема. Результаты профилирования показывают, что основное время тратится на методы Read(72%) и Seek(20%). Но есть вещи, которые я объяснить не могу:

1. Время обработки файла практически не зависит от того, где расположен обрабатываемый файл: на SDD и HDD. В обоих случаях время одно и то же.
2. Если сделать обработку файлов в 2 потока, то время обработки уменьшается в 1,5 раза. И по прежнему не зависит от того, где он расположен (SDD или HDD).

Как можно объяснить такое поведение программы? Можно ли как-то увеличить скорость обработки не прибегая к многопоточности?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.