我正在考虑使用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?
提前致谢。
答案 0 :(得分:2)
这听起来像对我来说过早优化。您是否使用过MemoryStream并进行了一些分析,以证明它导致了有形的,可测量的性能问题?
我会坚持使用传统的MemoryStream,直到明显(通过分析)有必要改变它为止自己的头痛。
答案 1 :(得分:0)
不,你没有改善现有的东西。 byte []是引用类型。您可以简单地将其传递给MemoryStream(byte [])构造函数,并且 no 数据将被复制。 MS只是存储对同一数组的引用。
事实上,你把它变得更糟,因为你固定了阵列。让垃圾收集在你的代码片段内部运行是不可能的,你正在从数组中读取东西,并且可能正在从数据,字符串和什么不是创建对象。垃圾收集器需要在固定阵列周围工作,使其寿命更加困难。这实际上可能会影响程序的性能一段时间,压缩堆对于提高CPU缓存效率非常重要。