Для моего проекта мне нужно написать 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
Как вы тестировали? Важно отметить, включали ли вы время, затрачиваемое на чтение всех данных, чтобы начать с вашего кода, учитывая, что данные считываются по частям в BinaryReader? Кроме того, вам нужен * этот код, чтобы быть быстрым? –
О скорости: я читаю изображения из двоичного файла, и при просмотре в «средстве просмотра изображений» вы можете почувствовать разницу, необходимую для отображения всех изображений. Время, затрачиваемое на чтение файла/создание объекта BinaryReader, незначительно, так как оно в основном мгновенно в обоих случаях. Я читал до 4000 байт каждый раз, когда выбрано новое изображение, поэтому мне нужно, чтобы оно было быстрым. Я думаю, что решение для потока памяти идеально подходит. – Adura
Дело в том, что создание BinaryReader * не * читает файл - он читает его как есть. Я очень сомневаюсь, что File.ReadAllBytes «в основном мгновен» - IO никогда не бывает. Все, что вы сделали с помощью MemoryStream, это front-load. Мне было бы интересно посмотреть, как вы измеряете производительность, поскольку я подозреваю, что вы * можете одурачить себя. –