Низкая производительность из метода удаления 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 мс. Это не то, что вы можете сделать во всех сценариях, но полезно знать.