2

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

提前致谢。

4

2 回答 2

2

这对我来说听起来像是过早的优化。您是否使用过 MemoryStream 并进行了一些分析以表明它给您带来了切实的、可衡量的性能问题?

我会坚持使用传统的 MemoryStream 并避免让自己头疼,直到它变得明显(通过分析)有必要进行更改。

于 2010-10-20T13:34:22.280 回答
0

不,你没有改进已经存在的东西。byte[] 是一个引用类型。您可以简单地将它传递给 MemoryStream(byte[]) 构造函数,并且不会复制任何数据。MS 只是存储对同一数组的引用。

事实上,因为你固定了数组,所以情况变得更糟了。让垃圾收集在您的代码片段主体内运行并非不可能,您正在从数组中读取内容,并且可能正在从数据、字符串等创建对象。垃圾收集器需要围绕固定数组工作,这使得它的生活变得更加困难。这实际上会在一段时间内影响程序的性能,压缩堆对于提高 CPU 缓存效率很重要。

于 2010-10-20T14:44:30.593 回答