【问题标题】:C#/.NET: UnmanagedMemoryStream for networking?C#/.NET:用于网络的 UnmanagedMemoryStream?
【发布时间】:2010-10-20 13:30:42
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 老实说,我认为这样做会带来更多的问题,而不是看到的好处。
  • 通过复制(太多)准确理解您的意思会很有帮助。对于在流上接收到的所有数据,是否有原因无法在内部缓冲(来自网络套接字的 MemoryStream 提供本地缓冲区 MemoryStream) - 如果没有,为什么这被认为无法满足您的需求?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多