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高好几倍,找了源代码扫了一下:RemoveAllO(n)且只有一次Array.ClearRemoveAt却每次都要Array.Copy(压缩空隙的操作),结果显而易见。严格来说,我是在Unity做的测试,但读的是.Net的源代码,好像有点不严谨

So,Once More:Test dont lie,Code dont lie。