Desempenho lento do método ImmutableList <T> Remove no Microsoft.Bcl.Immutable

Experimentando algum desempenho inesperado da MicrosoftImmutableList do pacote NuGetMicrosoft.Bcl.Immutable versão 1.0.34 e também 1.1.22-beta

Ao remover itens da lista imutável, o desempenho é muito lento. Para umImmutableList contendo 20000 valores inteiros (1 ... 20000) se começar a remover do valor 20000 para 1, leva cerca de 52 segundos para remover todos os itens da lista. Se eu fizer o mesmo com um genéricoList<T> onde eu crio uma cópia da lista após cada operação de remoção, leva cerca de 500 ms.

Fiquei um pouco surpreso com esses resultados, pois pensei queImmutableList seria mais rápido do que copiar um genéricoList<T>, mas talvez isso seja esperado?

Código de exemplo
// 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);
Atualizar

Se você remover itens desde o início doImmutableList, como em um loop foreach normal, o desempenho émuito melhor. A remoção de todos os itens leva menos de 100 ms. Isso não é algo que você pode fazer em todos os cenários, mas pode ser bom saber.

questionAnswers(1)

yourAnswerToTheQuestion