Wil*_*lem 9 c# arrays garbage-collection reusability
在我的代码中,我执行了大量任务,每个任务都需要大量内存来临时存储数据.我有大约500个任务.在每个任务开始时,我为数组分配内存:
double[] tempDoubleArray = new double[M];
Run Code Online (Sandbox Code Playgroud)
M是一个很大的数字,取决于精确的任务,通常大约2000000.现在,我做一些复杂的计算来填充数组,最后我使用数组来确定这个任务的结果.之后,tempDoubleArray超出范围.
分析表明构造数组的调用非常耗时.因此,我决定尝试重用数组,使其静态并重用它.它需要一些额外的杂耍来计算出阵列的最小尺寸,需要额外通过所有任务,但它可以工作.现在,程序更快(从80秒到22秒执行所有任务).
double[] tempDoubleArray = staticDoubleArray;
Run Code Online (Sandbox Code Playgroud)
但是,我有点不知道为什么这种方法运作得很好.我想在原始代码中,当tempDoubleArray超出范围时,可以收集它,所以分配一个新数组应该不那么难吗?
我问这个,因为理解为什么它会帮助我找出其他的方法来达到同样的效果,因为我想在什么情况下,分配给性能问题就知道了.
仅仅因为可以收集某些东西并不意味着它会.事实上,如果垃圾收集器像其收集中那样具有攻击性,那么您的性能将会明显变差.
请记住,创建数组不仅仅是创建一个变量,而是创建N
变量(N
即数组中元素的数量).尽管你必须小心谨慎,但重复使用数组是提高性能的良好方法.
为了澄清,我的意思是"创建变量"具体是为它们分配空间并执行运行时所具有的任何步骤以使它们可用(即将值初始化为零/ null).因为数组是引用类型,所以它们存储在堆上,这使得在内存分配方面生活变得复杂一些.根据数组的大小(无论它在总存储空间中是否超过85KB),它将存储在普通堆或大对象堆中.与所有其他堆对象一样,存储在普通堆上的数组可以触发堆的垃圾收集和压缩(这涉及在当前正在使用的内存中进行混洗以最大化连续的可用空间).
归档时间: |
|
查看次数: |
2314 次 |
最近记录: |