Para testar o desempenho de File.ReadAllBytes , criei um arquivo de 32 MB contendo dados binários e testei uma série de tamanhos de buffer de até 40 KB. Neste caso, ReadAllBytes foi quase 40x mais rápido do que qualquer um dos buffers que foram implementados.
A única razão para não usar ReadAllBytes é se o consumo de memória for um problema, caso em que você deseja ler o arquivo em blocos armazenados em buffer.
Resultados:
Top 10 Times
Length of file: 32068000 B
buffer size elapsed time
32068000 B 16
37608 B 599
24008 B 606
8808 B 607
34408 B 609
20808 B 612
22408 B 612
33608 B 612
30408 B 613
39208 B 613
Código de leitura em buffer:
static byte[] readBytes(string file_name, int buffer)
{
List<byte[]> dirtybytes = new List<byte[]>();
using (BinaryReader b = new BinaryReader(File.Open(file_name, FileMode.Open, FileAccess.Read)))
{
//hold position counters
int pos = 0;
int length = (int)b.BaseStream.Length;
while (pos < length)
{
//read the bytes
dirtybytes.Add(b.ReadBytes(buffer));
//increment the position
pos += buffer;
}
}
//get the complete byte array
return dirtybytes.SelectMany(x => x).ToArray();
}