C#清除数组中数据的几种方法及性能比较

C#清除数组中数据的几种方法及性能比较  

2012-04-06 22:01:53|  分类: C# |  标签:c#  清除数组  |举报|字号 订阅

int[] demo=new int[5];

for(int i=0;i<5;i++);

{

demo[i]=i;

}

以上是生成一个一维数组并对其赋值,如果要是清除数组中的数据,可能你的第一印象就是使用循环

for(int i=0;i<5;i++)

{

demo[i]=0;

}

但是当数组很大时这个种方法就没有那么好了
还有一种方法就是重新分配空间

demo = new int[5];

这个方法在数组很大时可能会引发托管堆上内存空间分配问题(详见 CSDNC#垃圾回收
另一种方法是使用 Array.Clear:

Array.Clear(demo,0,5);

参数2表示要清除的元素在数组的起始索引位置;
参数3表示从起始位置开始要清除的元素的个数;
这种方法的另一个好处是可以 清除数组中指定元素的数据

new方法和 Array.Clear的效率的比较:

byte[] test=new byte[1024]; test[2]=50; DateTime dt1=DateTime.Now; for(int i=0;i<10000;i++) { for(int a=0;a<1024;a++) { test[a]=0; } test[2]=50; } DateTime dt2=DateTime.Now; for(int i=0;i<10000;i++) { test=new byte[1024]; test[2]=50; } DateTime dt3=DateTime.Now; for(int i=0;i<10000;i++) { Array.Clear(test,0,1024); test[2]=50; } DateTime dt4=DateTime.Now; Console.WriteLine("for={0}\nnew={1}\nclear={2}\n",dt2-dt1,dt3-dt2,dt4-dt3);

运行结果:
C清除数组中数据的几种方法及性能比较 - wulin9005 - wulin9005

从上面的测试结果可以看出  Array.Clear的效率要高一些
但是上面的测试是基于需要大量(10000次)进行初始化数组的情况
如果我们只需要很少次的初始化情况又是什么样的呢?来看看测试吧
首先是1次的:
C清除数组中数据的几种方法及性能比较 - wulin9005 - wulin9005
10次的:
C清除数组中数据的几种方法及性能比较 - wulin9005 - wulin9005
100次的:
C清除数组中数据的几种方法及性能比较 - wulin9005 - wulin9005
1000次的:
C清除数组中数据的几种方法及性能比较 - wulin9005 - wulin9005
 
运行的情况大家一目了然了,关于for循环这里就不说了,不仅程序要相对复杂,而且性能也显著不行
现在我们来讨论一下new和Array.clear()
较少次的初始化 new的性能明显,但随着初始化次数的增加其弊端逐渐显现出来,因为new操作需要重新申请连续的内存空间,少量的初始化内存有足够的空间提供其使用,但次数多了,造成内存上产生很多垃圾空间,可用的连续内存空间减少从而触发GC回收垃圾空间, 要知道GC是一个相当占用时间的过程(有兴趣的可以看一下 GC的工作原理 ), 整理内存空间,将非垃圾数据全部移动到托管堆起始连续的一片内存空间上,致使部分或全部的对象的引用地址被改写。
Array.clear()操作在0~1000 次变化不是很大 。即使在增加到10000次也没有变化太大
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值