У меня есть спецификация двоичного файла, описывающая пакетную структуру данных. Каждый пакет данных имеет двухбайтовый шаблон синхронизации, поэтому возможно сканирование начала пакета с использованием комбинации BinaryReader
и FileStream
:
while(!reader.EndOfFile)
{
// Check for sync pattern.
if (reader.ReadUInt16() != 0xEB25)
{
// Move to next byte.
reader.BaseStream.Seek(-1, SeekOrigin.Current);
continue;
}
// If we got here, a sync pattern was found.
}
Этот процесс отлично работает в в прямом направлении, но аналогичное сканирование кода в обратном направлении происходит как минимум на два порядка медленнее:
while(!reader.BeginningOfFile)
{
// Check for sync pattern.
if (reader.ReadUInt16() != 0xEB25)
{
// Move to previous byte.
reader.BaseStream.Seek(-3, SeekOrigin.Current);
continue;
}
// If we got here, a sync pattern was found.
}
Я пробовал несколько обходных путей, таких как перемещение назад на произвольную величину (в настоящее время 1 мегабайт) и сканирование вперед, но это становится ясно, что мне действительно нужен BinaryReader
или FileStream
, модифицированный для обеспечения адекватных характеристик производительности при чтении как в прямом, так и в обратном направлении.
У меня уже есть FastFileStream
, который повышает производительность прямого чтения за счет подкласса обычного FileStream
и кэширования свойств Position
и Length
( он также предоставляет свойства BeginningOfFile
и EndOfFile
). Это то, что управляет переменной reader
в приведенном выше коде.
Есть ли что-то подобное, что я мог бы сделать для улучшения производительности обратного чтения, возможно, путем включения MemoryStream
в качестве буфера?