您的位置:首页 > 编程语言 > C#

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

2014-12-04 11:25 429 查看


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);
运行结果:



从上面的测试结果可以看出 Array.Clear的效率要高一些
但是上面的测试是基于需要大量(10000次)进行初始化数组的情况
如果我们只需要很少次的初始化情况又是什么样的呢?来看看测试吧
首先是1次的:



10次的:



100次的:



1000次的:



 
运行的情况大家一目了然了,关于for循环这里就不说了,不仅程序要相对复杂,而且性能也显著不行
现在我们来讨论一下new和Array.clear()
较少次的初始化new的性能明显,但随着初始化次数的增加其弊端逐渐显现出来,因为new操作需要重新申请连续的内存空间,少量的初始化内存有足够的空间提供其使用,但次数多了,造成内存上产生很多垃圾空间,可用的连续内存空间减少从而触发GC回收垃圾空间,要知道GC是一个相当占用时间的过程(有兴趣的可以看一下GC的工作原理),整理内存空间,将非垃圾数据全部移动到托管堆起始连续的一片内存空间上,致使部分或全部的对象的引用地址被改写。
Array.clear()操作在0~1000次变化不是很大。即使在增加到10000次也没有变化太大
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: