Как ускорить обратное сканирование бинарного файла?

У меня есть спецификация двоичного файла, описывающая пакетную структуру данных. Каждый пакет данных имеет двухбайтовый шаблон синхронизации, поэтому возможно сканирование начала пакета с использованием комбинации 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в качестве буфера?

27
задан Robert Harvey 5 March 2012 в 22:46
поделиться