我正在考虑使用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?

提前致谢。

最佳答案

不,您没有改善现有功能。 byte []是引用类型。您可以简单地将其传递给MemoryStream(byte [])构造函数,而不会复制任何数据。 MS只是存储对同一数组的引用。

实际上,由于固定阵列,使情况变得更糟。使垃圾回收在代码段的主体内运行并非不可能,您正在从数组中读取内容,并且可能正在根据数据,字符串和其他内容创建对象。垃圾收集器需要围绕固定的数组工作,这使它的生活变得更加困难。实际上,这可能会暂时影响程序的性能,压缩堆对于提高CPU缓存的效率很重要。

10-08 08:49