C#/。ネット:ネットワーキングのためのUnmanagedMemorystream?
-
09-10-2019 - |
質問
私は使用を検討していました UnmanagedMemorystream ネットワークサーバー内の着信(おそらく発信)パケットを処理するためのメモリストリームではなく。私が達成したいのは、値のコピーが少なく、可能であれば、ヒープにコピーすることを避けてください(多すぎます)。
たとえば、着信パケットの場合、次のことができます。
fixed (byte* p = &data) // where data comes from a socket receive
{
using (var stream = new UnmanagedMemoryStream(p, data.Length))
{
// do handling here...
}
}
それでも、これを行うことに現実的な利点があるかどうかはよくわかりません。古き良き管理されたメモリストリームを使用するのではなく、これを行うことに価値があるかどうかについて、誰かがいくつかのフィードバックを持って来ることができますか?
前もって感謝します。
解決
いいえ、あなたはすでにそこにあるものを改善しませんでした。バイト[]は参照タイプです。メモリストリーム(byte [])コンストラクターに渡すだけで渡すことができます いいえ データがコピーされています。 MSは、同じ配列への参照を保存するだけです。
実際、アレイを固定したため、悪化させました。スニペットのボディ内で走るためにゴミコレクションを取得することはほとんどありません。アレイからものを読んでいて、おそらくデータ、文字列、そのままからオブジェクトを作成しています。ゴミコレクターは、ピン留め配列を回避する必要があり、その生活をかなり困難にします。これは実際にプログラムのパフォーマンスにしばらく影響を与える可能性があります。CPUキャッシュを効率的にするためには、ヒープを圧縮することが重要です。
他のヒント
これは私にとって時期尚早の最適化のように聞こえます。 MemoryStreamを使用して、プロファイリングを行って、具体的で測定可能なパフォーマンスの問題を引き起こしたことを示しましたか?
私は従来のメモリストリームに固執し、変化する必要があることが明らかになるまで頭痛を保存します。