C# 数组Copy的效率问题
来源:互联网 发布:02年韩国黑哨 知乎 编辑:程序博客网 时间:2024/06/05 15:26
在C#中数组Copy是比较常用的,网上有很多帖子,但是写的也不是很完整,今天我对一些比较常用的方法做了一下总结。
1、 数组自带的CopyTo方法
private static void NewMethod(byte[] da, byte[] da1)
{
Stopwatch dd = new Stopwatch();
dd.Start();
for(int i=0;i< tcount;i++)
{
da.CopyTo(da1, 0);
}
dd.Stop();
Console.WriteLine("array copyto {0}", dd.ElapsedMilliseconds);
}
2、 数组的clone方法
private static void NewMethod1(byte[] da)
{
Stopwatch dd = new Stopwatch();
dd.Start();
byte[] ddd = null;
for (int i = 0; i < tcount; i++)
{
//ddd=da.Clone() as byte[];
da.Clone();
}
dd.Stop();
Console.WriteLine("array clone {0}", dd.ElapsedMilliseconds);
}
3、 Buffer.BlockCopy方法
private static void NewMethod2(byte[] da, byte[] da1)
{
Stopwatch dd = new Stopwatch();
dd.Start();
for (int i = 0; i < tcount; i++)
{
Buffer.BlockCopy(da, 0, da1, 0, da.Length);
}
dd.Stop();
Console.WriteLine("Buffer.BlockCopy {0}", dd.ElapsedMilliseconds);
}
4、Array.Copy方法
private static void NewMethod3(byte[] da, byte[] da1)
{
Stopwatch dd = new Stopwatch();
dd.Start();
for (int i = 0; i < tcount; i++)
{
Array.Copy(da, 0, da1, 0, da.Length);
}
dd.Stop();
Console.WriteLine(" Array.Copy {0}", dd.ElapsedMilliseconds);
}
5、Array.ConstrainedCopy方法
private static void NewMethod4(byte[] da, byte[] da1)
{
Stopwatch dd = new Stopwatch();
dd.Start();
for (int i = 0; i < tcount; i++)
{
Array.ConstrainedCopy(da, 0, da1, 0, da.Length);
}
dd.Stop();
Console.WriteLine(" Array.ConstrainedCopy {0}", dd.ElapsedMilliseconds);
}
6、Marshal.Copy方法
private static void NewMethod5(byte[] da, byte[] da1)
{
Stopwatch dd = new Stopwatch();
dd.Start();
//GCHandle handle= GCHandle.Alloc(da1, GCHandleType.Pinned); //获取数组的Intptr
//IntPtr des = handle.AddrOfPinnedObject();
IntPtr des = Marshal.AllocHGlobal(da1.Length); //获取数组的Intptr
for (int i = 0; i < tcount; i++)
{
Marshal.Copy(da, 0, des, da.Length);
}
//handle.Free();
dd.Stop();
Console.WriteLine(" Marshal.Copy {0}", dd.ElapsedMilliseconds);
}
主函数调用
private const int tcount=10000; //copy的次数
static void Main(string[] args)
{
string path = @"D:\C#Test\ChatServer\TestUdp\bin\Debug\1.txt"; 这是一个1.91M的文本文件
using (FileStream file = File.Open(path, FileMode.Open))
{
byte[] da = new byte[file.Length];
byte[] da1 = new byte[file.Length];
byte[] da11 = new byte[file.Length];
byte[] da12 = new byte[file.Length];
byte[] da13 = new byte[file.Length];
byte[] da14 = new byte[file.Length];
file.Read(da, 0, da.Length);
NewMethod(da, da1);
NewMethod1(da);
NewMethod2(da, da11);
NewMethod3(da, da12);
NewMethod4(da, da13);
NewMethod5(da, da14);
}
Console.ReadKey();
}
结果如下:
Marshal.Copy的效率是最高的,接下来是Buffer.Copy(这个方法有网友说是c写的),clone效率是最低的
- C# 数组Copy的效率问题
- C#中copy的效率问题,很不错,学习!
- 服务器端沾包处理的copy效率问题
- 关于C#数组初始化的效率测试
- 关于C#数组初始化的效率测试
- 关于C#数组初始化的效率测试
- 数组字典的copy,strong问题
- 使用数组、指针的效率问题
- 关于二维数组循环的效率问题
- C#中Delegate的效率问题
- C#中循环结构的效率问题
- C#中循环结构的效率问题
- C#的事件机制效率问题
- C#字符串连接的效率问题
- C#复制数组的两种方式,以及效率比较
- C# 数组下标的问题
- numpy数组扩展效率问题
- Matlab数组结构和循环效率的问题
- IOS开发,常用快捷键汇总
- Lovely Palindromes
- [BZOJ 1028] [纪中3066] 麻将 水暴力
- 使用RemoteViews自定义通知栏样式
- 设计模式-命令模式
- C# 数组Copy的效率问题
- 分析一个java快速开发的工具
- SYSLOG 的学习和使用
- 在解析Json格式字符串时遇到的问题
- Swift-基础
- jni应用(构造和方法)
- Java NIO系列教程(十) Java NIO DatagramChannel
- 红黑树
- 从零开始,DIY一个jQuery(1)