关于在C#中数组(byte[])复制的两种方式。字节偏移复制与安全复制
来源:互联网 发布:js验证 是否为英文 编辑:程序博客网 时间:2024/05/19 21:44
static void Main(string[] args)
{
int[] src = new[] { 1, 2, 3, 4, 5, 6 };
const int destLen = 4;//目标数组大小
int int_size = sizeof(int);//用于获取值类型的字节大小。
int[] dest = new int[destLen];
//只支持基元类型,按字节偏移复制
Buffer.BlockCopy(src, (src.Length - destLen) * int_size, dest, 0, destLen * int_size);
foreach (var i in dest)
{
Console.Write(i + " ");
}
Console.WriteLine("\n-------------------------------------------");
string[] srcstr = new[] { "A", "B", "C", "D", "E", "F" };
object[] destobj = new object[src.Length - 2];
//移除的元素个数
const int dellen = 2;
//保证不破坏目标数组的元素(回滚)。不装箱、拆箱、或向下转换,否则报错。
//如果srcstr改为src则报错,因为装箱。
Array.ConstrainedCopy(srcstr, dellen, destobj, 0, srcstr.Length - dellen);
foreach (var s in destobj)
{
Console.Write(s + " ");
}
}
对指定数组和目标数组,两者类型一致的前提下,进行复制10亿次,
消耗时间如下:
copy:59.374s,constrainecopy:48.415 s,blockcopy:23.219s
代码没什么就是测试下,核心测试如下:
int[] ints = { 1534, 233, 332, 423, 524, 3246, 4357, 734, 567, 43, 34254, 325, 3325, 2423, 345, 575, 235, 1, 342, 1, 6, 54645, 5432, 5 };
int[] dest = new int[ints.Length];
Array.Copy(ints, dest, ints.Length);
Array.ConstrainedCopy(ints, 0, dest, 0, ints.Length);
Buffer.BlockCopy(ints, 0, dest, 0, ints.Length * 4);
注解分析:
1,Array.Copy在CLR处理机制中最灵活,最强大,可装箱,拆箱复制,可加宽CLR基元类型,可内部判断实现了IFarmattable接口的兼容转换,当然这种强大方式必然会带来一定的性能损失。
2,Array.ConstrainedCopy 对复制要求严格,只能是同类型或者源数组类型是目标类型的派生元素类型,不执行装箱,拆箱,向下转换
3,Buffer.BlockCopy 则从本质上以字节为复制单位,这在底层语言C,C++的处理优势上,同理,效率之高可以理解。
当然如果对性能要求不高,Copy足矣,毕竟在上千次复制下,三者基本没消耗多少时间。使用时可根据项目需求斟酌选择!
- 关于在C#中数组(byte[])复制的两种方式。字节偏移复制与安全复制
- 关于在C#中数组(byte[])复制的两种方式。字节偏移复制与安全复制
- C# 常见的字节数组 byte[] 复制方法
- C#复制数组的两种方式,以及效率比较
- 关于java中如何复制字节数组
- C#中数组的复制
- C#中数组复制
- C#中复制数组
- C#中struct的字节对齐、转换操作和复制为二进制数据(byte[])
- C#中struct的字节对齐、转换操作和复制为二进制数据(byte[])
- c#两种方式 dataset 与byte[] 字节的转换
- C#实现深复制的两种方式
- C# 数组的复制
- C#中怎么复制数组?C#复制数组的5种方法!
- C#中怎么复制数组?C#复制数组的5种方法
- 关于 数组的复制 ;
- java 复制byte数组
- Java中复制文件的两种方式
- Hadoop、Pig、Hive、Storm、NOSQL 学习资源收集
- linux驱动子系统--TTY
- monotouch打包发布至Appstore
- VC环境下DLL接口申明的三种方式
- 新版的ADT联网操作需要注意的地方
- 关于在C#中数组(byte[])复制的两种方式。字节偏移复制与安全复制
- JAVA缓存的实现
- hdu 4712 (随机算法)
- 黑马程序员_高新技术_注释
- Android系统调用短信、电子邮件、蓝牙、社交网站等分享接口
- context-param与init-param的区别与作用
- hdu 2473 (并查集 删除操作)
- 避免敏捷中的浪费
- tomcat限制ip访问