2013-06-18 7 views
0

Для моего проекта мне нужно написать UInt16, UInt32, Bytes and Strings из файла. Я начал с простым классом я написал так:C# BinaryReader заметно медленнее. Альтернатива?

public FileReader(string path) //constructor 
    { 
     if (!System.IO.File.Exists(path)) 
      throw new Exception("FileReader::File not found."); 

     m_byteFile = System.IO.File.ReadAllBytes(path); 
     m_readPos = 0; 
    } 
    public UInt16 getU16() // basic function for reading 
    { 
     if (m_readPos + 1 >= m_byteFile.Length) 
      return 0; 

     UInt16 ret = (UInt16)((m_byteFile[m_readPos + 0]) 
          + (m_byteFile[m_readPos + 1] << 8)); 
     m_readPos += 2; 
     return ret; 
    } 

Я думал, что это может быть лучше использовать уже существующие BinaryReader, хотя и так я пробовал, но я заметил, что это медленнее, чем мой подход. Может кто-нибудь объяснить, почему это так, и если есть еще один уже существующий класс, который я мог бы использовать для загрузки файла и чтения из него?

~ Adura

+0

Как вы тестировали? Важно отметить, включали ли вы время, затрачиваемое на чтение всех данных, чтобы начать с вашего кода, учитывая, что данные считываются по частям в BinaryReader? Кроме того, вам нужен * этот код, чтобы быть быстрым? –

+0

О скорости: я читаю изображения из двоичного файла, и при просмотре в «средстве просмотра изображений» вы можете почувствовать разницу, необходимую для отображения всех изображений. Время, затрачиваемое на чтение файла/создание объекта BinaryReader, незначительно, так как оно в основном мгновенно в обоих случаях. Я читал до 4000 байт каждый раз, когда выбрано новое изображение, поэтому мне нужно, чтобы оно было быстрым. Я думаю, что решение для потока памяти идеально подходит. – Adura

+0

Дело в том, что создание BinaryReader * не * читает файл - он читает его как есть. Я очень сомневаюсь, что File.ReadAllBytes «в основном мгновен» - IO никогда не бывает. Все, что вы сделали с помощью MemoryStream, это front-load. Мне было бы интересно посмотреть, как вы измеряете производительность, поскольку я подозреваю, что вы * можете одурачить себя. –

ответ

1

У вас есть все данные авансом в массив в памяти, тогда как BinaryReader потоки байтов в одном, в то время из источника, который я предполагаю, это файл на диске. Я думаю, вы могли бы ускорить его, передав ему поток, который считывает из в памяти массива:

Stream stream = new MemoryStream(byteArray); 
//Pass the stream to BinaryReader 

Обратите внимание, что при таком подходе вам нужно заполнить весь файл в памяти сразу, но я предполагаю, что это нормально для вы.

+0

_This_ подход, кажется, обеспечивает производительность, равную моей попытке, но она уже поставляется с исключениями, поэтому я предполагаю, что я буду использовать это. Спасибо. – Adura

Смежные вопросы