Низкая производительность из метода удаления ImmutableList <T> в Microsoft.Bcl.Immutable

Испытывает неожиданную производительность от MicrosoftImmutableList из пакета NuGetMicrosoft.Bcl.Immutable версия 1.0.34, а также 1.1.22-бета

При удалении элементов из неизменяемого списка производительность очень низкая. ДляImmutableList содержит 20000 целочисленных значений (1 ... 20000), если для удаления значения от 20000 до 1 требуется около 52 секунд, чтобы удалить все элементы из списка. Если я сделаю то же самое с общимList<T> где я создаю копию списка после каждой операции удаления, это занимает около 500 мс.

Я был немного удивлен этими результатами, так как думал, чтоImmutableList будет быстрее, чем копировать общийList<T>, но, возможно, этого следовало ожидать?

Пример кода
// Generic List Test
var genericList = new List<int>();

var sw = Stopwatch.StartNew();
for (int i = 0; i < 20000; i++)
{
    genericList.Add(i);
    genericList = new List<int>(genericList);
}
sw.Stop();
Console.WriteLine("Add duration for List<T>: " + sw.ElapsedMilliseconds);
IList<int> completeList = new List<int>(genericList);

sw.Restart();

// Remove from 20000 -> 0.
for (int i = completeList.Count - 1; i >= 0; i--)
{
    genericList.Remove(completeList[i]);
    genericList = new List<int>(genericList);
}
sw.Stop();
Console.WriteLine("Remove duration for List<T>: " + sw.ElapsedMilliseconds);
Console.WriteLine("Items after remove for List<T>: " + genericList.Count);


// ImmutableList Test
var immutableList = ImmutableList<int>.Empty;

sw.Restart();
for (int i = 0; i < 20000; i++)
{
    immutableList = immutableList.Add(i);
}
sw.Stop();
Console.WriteLine("Add duration for ImmutableList<T>: " + sw.ElapsedMilliseconds);

sw.Restart();

// Remove from 20000 -> 0.
for (int i = completeList.Count - 1; i >= 0; i--)
{
    immutableList = immutableList.Remove(completeList[i]);
}
sw.Stop();
Console.WriteLine("Remove duration for ImmutableList<T>: " + sw.ElapsedMilliseconds);
Console.WriteLine("Items after remove for ImmutableList<T>: " + immutableList.Count);
Обновить

Если удалить элементы из началаImmutableList, как с обычным циклом foreach, то производительностьнамного лучше, Удаление всех элементов занимает менее 100 мс. Это не то, что вы можете сделать во всех сценариях, но полезно знать.

Ответы на вопрос(1)

Ваш ответ на вопрос