Следующий код:
List<Interval> intervals = new List<Interval>();
List<int> points = new List<int>();
//Initialization of the two lists
// [...]
foreach (var point in points)
{
intervals.RemoveAll (x => x.Intersects (point));
}
по крайней мере, на 100 раз быстрее, чем при списках размером ~ 10000:
List<Interval> intervals = new List<Interval>();
List<int> points = new List<int>();
//Initialization of the two lists
// [...]
foreach (var point in points)
{
for (int i = 0; i < intervals.Count;)
{
if (intervals[i].Intersects(point))
{
intervals.Remove(intervals[i]);
}
else
{
i++;
}
}
}
Как это возможно? Что происходит под капотом с помощью "RemoveAll"? Согласно MSDN, "RemoveAll" выполняет линейный поиск и, следовательно, находится в O (n). Поэтому я ожидал бы аналогичную производительность для обоих.
При замене "Удалить" на "RemoveAt" итерация выполняется намного быстрее, сравнимо с "RemoveAll". Но у "Remove" и "RemoveAt" есть сложность O (n), так почему разница в производительности между ними такая большая? Может ли это быть только из-за того, что "Удалить (элемент)" сравнивает элементы списка с "item" и "RemoveAt" не выполняет никакого сравнения?