Geo*_*ge2 26 .net c# memory performance
我正在使用.Net 3.5(C#),我听说C#的性能List<T>.ToArray
"糟糕",因为它为所有元素的内存副本形成了一个新的数组.真的吗?
Joe*_*Joe 51
不,那不是真的.性能很好,因为它所做的只是内存复制所有元素(*)以形成一个新数组.
当然,这取决于你所定义的"好"或"坏"表现.
(*)引用类型的引用,值类型的值.
编辑
在回复您的评论时,使用Reflector是检查实现的好方法(见下文).或者只考虑几分钟如何实现它,并相信微软的工程师不会提出更糟糕的解决方案.
public T[] ToArray()
{
T[] destinationArray = new T[this._size];
Array.Copy(this._items, 0, destinationArray, 0, this._size);
return destinationArray;
}
Run Code Online (Sandbox Code Playgroud)
当然,"好"或"坏"表现只相对于某些选择具有意义.如果在您的具体情况下,有一种替代技术可以更快地实现您的目标,那么您可以将性能视为"糟糕".如果没有这样的替代方案,那么表现就是"好"(或"足够好").
编辑2
回应评论:"没有重建物体?" :
没有重建参考类型.对于值类型,复制值,可以将其粗略地描述为重建.
Sor*_*tis 21
调用ToArray的原因()
没有调用ToArray的原因()
取自这里
是的,确实可以对所有元素进行内存复制。这是性能问题吗?这取决于您的性能要求。
在List
内部包含一个数组来保存所有元素。如果容量不足以容纳列表,则阵列会增加。无论何时,列表都会将所有元素复制到新数组中。这种情况一直在发生,对于大多数人而言,这并不是性能问题。
例如,具有默认构造函数的列表以容量16开始,当您.Add()
使用第17个元素时,它将创建一个大小为32的新数组,复制16个旧值并添加第17个值。
大小差异也是ToArray()
返回新数组实例而不传递私有引用的原因。
归档时间: |
|
查看次数: |
29514 次 |
最近记录: |