Каково влияние использования памяти на использование множества итераторов в C#? Предположим, что программа, которая выполняет тысячи циклов foreach
- каждый цикл выделяет временный объект в куче по вызову GetEnumerator
? Является ли CLR какой-либо оптимизацией (например, распределение стека IEnumerator
объектов)? Или это просто не достаточно важный вопрос, о котором даже беспокоиться?Использование итераторов памяти в C#
ответ
Это просто не достаточно важно, чтобы беспокоиться в большинстве случаев. Как указывает Эрик, может быть случаях, где это важно, но они довольно мало и далеко друг от друга по моему опыту.
Если вы делаете сотни тысяч foreach
петель, предположительно, вы делаете фактические в этих циклах. Это почти наверняка будет далеким более важным, чем сами итераторы.
Обратите внимание, что использование foreach
над массивом (известно, что это массив во время компиляции, то есть) не использует IEnumerable<T>
в любом случае - он использует прямую индексацию. Однако я бы не изменил свой код на основе этого.
Как и прежде, если вас беспокоит производительность, вам необходимо измерить его и профилировать. Узкие места почти никогда не ожидаются.
Часто компилятор может оптимизировать цикл foreach в простой цикл, который требует только индексной переменной в стеке (или в регистре процессора).
Если итератор все еще используется, большинство из них являются структурами, поэтому они просто выделяются в стеке, а не в куче.
Несколько итераторов, которые являются классами, все еще довольно малы и быстры. Вы могли бы создать миллионы из них без заметного воздействия.
Звучит здорово ... Быстрый вопрос о последующем: если я реализую интерфейс IEnumerable, по определению метод GetEnumerator возвращает IEnumerator. Если мой пользовательский итератор является структурой, я предполагаю, что он будет возвращен как объект в штучной упаковке? –
Jen, _carefully_ посмотрите, как выглядит List
Но опять же, как говорит Джон, не делайте этого глупого, если у вас нет достоверных данных о том, что создание счетчиков в куче является основной причиной реальной проблемы производительности, зависящей от клиента. Типы изменяемых значений вызывают всевозможные странные проблемы, которые дорого отлаживаются и трудно понять. –
- 1. ostream использование итераторов в C++
- 2. Использование итераторов
- 3. C++: использование стирания в векторе итераторов
- 4. Расширение итераторов в C++
- 5. Важность итераторов в C++
- 6. О итераторов в C++
- 7. Использование потоковых итераторов?
- 8. Повторное использование итераторов потока
- 9. Использование итераторов на картах
- 10. Использование памяти в C#
- 11. Использование памяти в C++
- 12. Использование авто для итераторов
- 13. Использование двух итераторов в _.uniq()
- 14. Java - использование итераторов с массивами
- 15. Умное использование .Net 2 итераторов
- 16. использование итераторов из середины петли
- 17. Срок действия итераторов итераторов
- 18. C++ проблемы итераторов
- 19. C++ вектор итераторов
- 20. Использование итераторов STL с векторами
- 21. Использование памяти Objective-C
- 22. Использование памяти C#
- 23. Повторное использование памяти в C
- 24. Использование памяти словарей в C#
- 25. Использование памяти кучи в C++
- 26. Использование памяти SQLIte в C#
- 27. Использование динамической памяти в C
- 28. Повторное использование памяти в C++
- 29. использование памяти словаря в C#
- 30. C# Использование памяти WebClient
Несмотря на то, что, как всегда, отличный совет Джон, наше тестирование производительности показало значительное влияние производительности от размещения кучи/мусора в итераторах в некоторых реальных сценариях. Вот почему перечислитель - это злой тип изменяемого значения, а не ссылочный тип. Но, конечно, ключевая фраза - «наше тестирование производительности» - как вы заметили, глупо принимать решения о производительности без данных. –
Ах да, злой изменчивый 'List' iterators - Кажется, я помню сообщение в новостной группе с тем, что выглядело как разумный фрагмент кода, но который дал некоторые очень странные результаты из-за именно этого дизайнерского решения :) Я отредактирую ответ во всяком случае, хотя ... одеяло утверждает, что «это неважно» редко бывает хорошей идеей. –