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

时间:2022-01-10 19:26:09

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