Почему перечислитель ImmutableList<T>намного медленнее, чем List<T>
У меня есть кусок кода, который часто перебирает небольшой список. Учитывая, что список никогда не меняется во время выполнения, я заменил реализацию на ImmutableList<T>
, Если посмотреть на трассировку производительности с помощью dotTrace, она работает намного хуже, чем обычно List<T>
:
(List<T>
слева, ImmutableList<T>
справа)
Почему это происходит и есть ли обходной путь?
1 ответ
В отличие от List<T>
который оборачивается вокруг массива, размер которого изменяется по мере необходимости, ImmutableList<T>
внутренне использует неизменяемое дерево AVL ( см. видео Channel9, обсуждающее это).
Так как же мне все еще достичь этого, используя Неизменные Коллекции?
использование ImmutableArray<T>
,
Цитирование из блога.NET Framework о неизменных коллекциях
Причины использования неизменяемого массива:
- Обновление данных редко или количество элементов довольно мало (<16)
- Вы должны иметь возможность перебирать данные в критических разделах производительности
- у вас есть много экземпляров неизменных коллекций, и вы не можете позволить себе хранить данные в деревьях
Причины придерживаться неизменного списка:
- Обновление данных является распространенным явлением или число элементов не должно быть небольшим
- Обновление коллекции более критично для производительности, чем перебор содержимого.