如何最快速的从内存流中拷贝数据到byte数组

YG_jzjz 2018-07-16 04:56:56
现在,我有一个 object 对象,采用.Net的二进制序列化器序列化到内存流,
此时我需要获取流中的数据,哪种方法最快?
我所知到的有
1、流 ToArray() 方法
2、流 Read() 方法
3、Buffer.BlockCopy() + 流 GetBuffer() 方法
以上三种,我不会测试哪个快,哪位大神说下如何测试
或者说还有没有其他更好的方法
...全文
467 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
YG_jzjz 2018-08-03
  • 打赏
  • 举报
回复
引用 13 楼 u011017980 的回复:
[quote=引用 9 楼 qq_38202916 的回复:]
[quote=引用 7 楼 u011017980 的回复:]
https://blog.csdn.net/u011017980/article/details/52241884

不好意思,今天才看到,我还有一个问题,使用Marshal.Copy(),获得了一个句柄,
是否需要释放这个句柄。我看到你的博客中,有注释的方法,能详细说说吗?
[/quote]
这个函数是托管调用非托管的,获取数组句柄有两种方式 ,注掉的是一种,还有通过这个函数Marshal.AllocHGlobal(da1.Length)申请空间,返回句柄,非托管代码在用完的时候手动释放一次就行。我本人建议不是特殊需求,可以考虑用Buffer.BlockCopy()[/quote]
最后一个问题了,释放掉句柄后,你Marshal.Copy()方法中最后得到的数组 byte[] da ,da是托管数组对吧?
小数点666 2018-08-01
  • 打赏
  • 举报
回复
引用 9 楼 qq_38202916 的回复:
[quote=引用 7 楼 u011017980 的回复:]
https://blog.csdn.net/u011017980/article/details/52241884

不好意思,今天才看到,我还有一个问题,使用Marshal.Copy(),获得了一个句柄,
是否需要释放这个句柄。我看到你的博客中,有注释的方法,能详细说说吗?
[/quote]
这个函数是托管调用非托管的,获取数组句柄有两种方式 ,注掉的是一种,还有通过这个函数Marshal.AllocHGlobal(da1.Length)申请空间,返回句柄,非托管代码在用完的时候手动释放一次就行。我本人建议不是特殊需求,可以考虑用Buffer.BlockCopy()
wanghui0380 2018-07-31
  • 打赏
  • 举报
回复
so,
public virtual bool TryGetBuffer(
out ArraySegment<byte> buffer)


这个才是我们推荐的,而不是Marshal.Copy
wanghui0380 2018-07-31
  • 打赏
  • 举报
回复
快不快不是俺们考虑的问题,我们最应该担心的问题是“ out of memory”,你分配大的byte[]越快,你的程序崩溃的越快。
所以我们不为快操心,我们为稳定分配内存操心
蒋晟 2018-07-30
  • 打赏
  • 举报
回复
Marshal.Copy是void
你说的是Marshal.Copy的目标内存区的话,如果是你申请的,那么你当然需要释放。
YG_jzjz 2018-07-30
  • 打赏
  • 举报
回复
引用 7 楼 u011017980 的回复:
https://blog.csdn.net/u011017980/article/details/52241884

不好意思,今天才看到,我还有一个问题,使用Marshal.Copy(),获得了一个句柄,
是否需要释放这个句柄。我看到你的博客中,有注释的方法,能详细说说吗?
threenewbee 2018-07-17
  • 打赏
  • 举报
回复
Marshal.Copy就是最快的。看不懂去看msdn
bsdekj2 2018-07-17
  • 打赏
  • 举报
回复

Stopwatch watch = new Stopwatch();
watch.Start();
//具体内容
watch.Stop();
watch.ElapsedMilliseconds//总时间
小数点666 2018-07-17
  • 打赏
  • 举报
回复
https://blog.csdn.net/u011017980/article/details/52241884
xian_wwq 2018-07-17
  • 打赏
  • 举报
回复
内存copy肯定是最快的。
如果数据量不大,根本不需要纠结哪一种更快,
解析速度满足需求就可以了。

倒是有一点可以优化,
.net的二进制序列化由于基于反射机制,效率不高,
可以考虑自行编码来替代






YG_jzjz 2018-07-16
  • 打赏
  • 举报
回复
自己顶一下
YG_jzjz 2018-07-16
  • 打赏
  • 举报
回复
YG_jzjz 2018-07-16
  • 打赏
  • 举报
回复
引用 1 楼 qq_39106738 的回复:
using System.Runtime.InteropServices;
Marshal.Copy()

看不懂,,,,
qq_39106738 2018-07-16
  • 打赏
  • 举报
回复
using System.Runtime.InteropServices;
Marshal.Copy()

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧