Por que copiar um fluxo e, em seguida, desserializar usando um BinaryFormatter mais rápido do que apenas desserializar

9

Esse código leva cerca de 8 segundos com um fluxo contendo cerca de 65K vindo de um blob em um banco de dados

private string[] GetArray(Stream stream)
{
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    object result = binaryFormatter.Deserialize(stream);
    return (string[])result;
}

Este código demora alguns milissegundos:

private string[] GetArray(Stream stream)
{
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    MemoryStream memoryStream = new MemoryStream();
    Copy(stream, memoryStream);
    memoryStream.Position = 0;
    object result = binaryFormatter.Deserialize(memoryStream);
    return (string[])result;
}

Por quê?

    
por Lars Peder Amlie 09.01.2013 в 10:32
fonte

1 resposta

5

Então você diz que o problema desaparece quando o banco de dados é retirado da equação. Aqui está minha teoria:

BinaryFormatter lê o fluxo em pequenos incrementos. Ele tem para ler o mínimo possível para que ele não engole acidentalmente alguns bytes após o objeto serializado. Isso significa que está emitindo toneladas de comandos de leitura (verifiquei isso com o Reflector).

Provavelmente, cada leitura do fluxo de blob está causando uma viagem de ida e volta à rede (ou alguma outra sobrecarga principal). Isso oferece milhões de viagens de ida e volta se você usar BinaryFormatter imediatamente.

O buffer primeiro faz com que a rede seja utilizada de forma mais eficiente, porque o tamanho do buffer de leitura é muito maior.

    
por usr 09.01.2013 / 14:23
fonte