Почему перечислитель ImmutableList<T>намного медленнее, чем List<T>

У меня есть кусок кода, который часто перебирает небольшой список. Учитывая, что список никогда не меняется во время выполнения, я заменил реализацию на ImmutableList<T>, Если посмотреть на трассировку производительности с помощью dotTrace, она работает намного хуже, чем обычно List<T>:

Результат dotTrace (List<T> слева, ImmutableList<T> справа)

Почему это происходит и есть ли обходной путь?

1 ответ

Решение

В отличие от List<T> который оборачивается вокруг массива, размер которого изменяется по мере необходимости, ImmutableList<T> внутренне использует неизменяемое дерево AVL ( см. видео Channel9, обсуждающее это).

Так как же мне все еще достичь этого, используя Неизменные Коллекции?

использование ImmutableArray<T>,

Цитирование из блога.NET Framework о неизменных коллекциях

Причины использования неизменяемого массива:

  • Обновление данных редко или количество элементов довольно мало (<16)
  • Вы должны иметь возможность перебирать данные в критических разделах производительности
  • у вас есть много экземпляров неизменных коллекций, и вы не можете позволить себе хранить данные в деревьях

Причины придерживаться неизменного списка:

  • Обновление данных является распространенным явлением или число элементов не должно быть небольшим
  • Обновление коллекции более критично для производительности, чем перебор содержимого.
Другие вопросы по тегам