2

ネットワーク サーバーで受信 (およびおそらく送信) パケットを処理するために、MemoryStream ではなくUnmanagedMemoryStreamを使用することを検討していました。私が達成したいのは、値のコピーを減らし、可能であれば、ヒープへのコピーを避けることです (多すぎます)。

たとえば、着信パケットの場合、次のことができます。

fixed (byte* p = &data) // where data comes from a socket receive
{
    using (var stream = new UnmanagedMemoryStream(p, data.Length))
    {
        // do handling here...
    }
}

それでも、これを行うことに現実的な利点があるかどうかはよくわかりません。古き良き管理された MemoryStream を使用するのではなく、これを行うことに価値があるかどうかについて、誰かフィードバックをいただけますか?

前もって感謝します。

4

2 に答える 2

2

これは時期尚早の最適化のように思えます。MemoryStream を使用し、プロファイリングを行って、具体的で測定可能なパフォーマンスの問題が発生したことを示しましたか?

従来の MemoryStream に固執し、変更が必要であることが (プロファイリングによって) 明らかになるまで、頭痛の種から解放されます。

于 2010-10-20T13:34:22.280 に答える
0

いいえ、あなたはすでにあるものを改善していません。byte[] は参照型です。それを MemoryStream(byte[]) コンストラクターに渡すだけで、データはコピーされません。MS は、同じ配列への参照を格納するだけです。

実際、アレイを固定したため、さらに悪化しました。スニペットの本体内でガベージ コレクションを実行する可能性は低くありません。配列からデータを読み取り、データ、文字列などからオブジェクトを作成している可能性があります。ガベージ コレクターは固定配列を回避する必要があるため、その動作がかなり困難になります。これは、実際にはしばらくの間プログラムのパフォーマンスに影響を与える可能性があります。ヒープを圧縮することは、CPU キャッシュを効率的にするために重要です。

于 2010-10-20T14:44:30.593 に答える