C#/ .NET:用于联网的UnmanagedMemoryStream?

时间:2010-10-20 13:30:42

标签: c# .net memory networking unmanaged-memory

我正在考虑使用UnmanagedMemoryStream而不是MemoryStream来处理网络服务器中的传入(也可能是传出?)数据包。我希望实现的是减少值的复制,如果可能的话,避免复制到堆(太多)。

例如,对于传入的数据包,可以执行以下操作:

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

尽管如此,我还不确定这样做是否有任何实际好处。任何人都可以得到一些反馈,关于这样做是否有任何价值,而不是使用旧的托管MemoryStream?

提前致谢。

2 个答案:

答案 0 :(得分:2)

这听起来像对我来说过早优化。您是否使用过MemoryStream并进行了一些分析,以证明它导致了有形的,可测量的性能问题?

我会坚持使用传统的MemoryStream,直到明显(通过分析)有必要改变它为止自己的头痛。

答案 1 :(得分:0)

不,你没有改善现有的东西。 byte []是引用类型。您可以简单地将其传递给MemoryStream(byte [])构造函数,并且 no 数据将被复制。 MS只是存储对同一数组的引用。

事实上,你把它变得更糟,因为你固定了阵列。让垃圾收集在你的代码片段内部运行是不可能的,你正在从数组中读取东西,并且可能正在从数据,字符串和什么不是创建对象。垃圾收集器需要在固定阵列周围工作,使其寿命更加困难。这实际上可能会影响程序的性能一段时间,压缩堆对于提高CPU缓存效率非常重要。