9

このコードは、データベース内のBLOBからの約65Kを含むストリームで約8秒かかります

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

このコードには数ミリ秒かかります。

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;
}

なんで?

4

1 に答える 1

5

つまり、データベースが方程式から外されると、問題はなくなると言います。これが私の理論です:

BinaryFormatterストリームから少しずつ読み取ります。シリアル化されたオブジェクトの数バイト誤って飲み込んでしまわないように、読み取りはできるだけ少なくする必要があります。これは、大量の読み取りコマンドを発行していることを意味します(これはReflectorで確認しました)。

おそらく、blobストリームを読み取るたびに、ネットワークラウンドトリップ(またはその他の主要なオーバーヘッド)が発生しています。BinaryFormatterすぐに使用すると、何百万もの往復が可能になります。

読み取りバッファのサイズがはるかに大きいため、最初にバッファリングを行うと、ネットワークがより効率的に利用されます。

于 2013-01-09T13:23:01.557 に答える