Remove Vs RemoveAll
有个feature需要比较高频率的从集合中移除一部分元素,稍微脑洞了一下,感觉用for-loop
+Remove
应该比RemoveAll
要快(可能是RemoveAll
的example里用了lambda,影响了判断)。
BUT,test dont lie,写了个测试试了下:
var list = new List<int>();
for (int i = 0; i < 1000; i++)
{
list.Add(i % 3);
}
var iter = 1000;
Profile("Remove", iter, () =>
{
var l = list.ToList();
for (int i = l.Count - 1; i > -1; i--)
{
if (l[i] == 0)
{
l.RemoveAt(i);
}
}
});
Profile("Remove All", iter, () =>
{
var l = list.ToList();
l.RemoveAll(item => item == 0);
});
结果RemoveAll
效率要比Remove
高好几倍,找了源代码扫了一下:RemoveAll
是O(n)
且只有一次Array.Clear
,RemoveAt
却每次都要Array.Copy
(压缩空隙的操作),结果显而易见。严格来说,我是在Unity做的测试,但读的是.Net的源代码,好像有点不严谨
So,Once More:Test dont lie,Code dont lie。