Я пишу диспетчер рендеринга сетки и подумал, что было бы неплохо сгруппировать все меши, которые используют один и тот же шейдер, а затем визуализировать их, пока я нахожусь в этом проходе шейдера.
В настоящее время я использую foreach
цикл, но мне интересно, может ли использование LINQ повысить производительность?
c#
performance
linq
foreach
Нил Найт
источник
источник
Ответы:
Почему LINQ должен быть быстрее? Он также использует циклы внутри.
В большинстве случаев LINQ будет немного медленнее, потому что он вызывает накладные расходы. Не используйте LINQ, если вам важна производительность. Используйте LINQ, потому что вам нужен более короткий, удобочитаемый и поддерживаемый код.
источник
LINQ-to-Objects обычно добавляет некоторые незначительные накладные расходы (несколько итераторов и т. Д.). Он по-прежнему выполняет циклы и вызывает вызовы делегатов, и , как правило, ему приходится выполнять дополнительное разыменование, чтобы добраться до захваченных переменных и т. Д. В большинстве кодов это будет практически незаметно, и более того, чем это будет предоставлено более простым для понимания кодом.
С другими поставщиками LINQ , как LINQ к SQL, то , так как запрос может фильтровать на сервере должно быть гораздо лучше , чем в квартире
foreach
, но , скорее всего , вы не сделали бы одеяло в"select * from foo"
любом случае , так что это не обязательно справедливым сравнение.Re PLINQ; параллелизм может сократить затраченное время, но общее время ЦП обычно немного увеличивается из-за накладных расходов на управление потоками и т. д.
источник
List<Foo>
; вместо этого я должен использоватьforeach
блок для этих коллекций. Рекомендация использоватьforeach
в этих контекстах имеет смысл. Мое беспокойство: следует ли заменять запросы LINQ на запросы только вforeach
случае обнаружения проблем с производительностью? Забегая вперед, я рассмотрюforeach
первое.Я думаю, что LINQ лучше использовать в
foreach
цикле, потому что он дает более чистый и простой для понимания код. Но LINQ медленнее, чемforeach
. Чтобы узнать больше, прочтите статью LINQ vs FOREACH vs FOR Loop Performance .источник
LINQ сейчас работает медленнее, но в какой-то момент может стать быстрее. Преимущество LINQ в том, что вам не нужно заботиться о том, как он работает. Если придумать новый метод, который будет невероятно быстрым, люди в Microsoft смогут реализовать его, даже не сообщая вам, и ваш код будет намного быстрее.
Что еще более важно, LINQ намного легче читать. Этого должно быть достаточно.
источник
Вероятно, следует отметить, что
for
цикл быстрее, чемforeach
. Итак, для исходного сообщения, если вас беспокоит производительность критического компонента, такого как средство визуализации, используйтеfor
цикл.Ссылка: в .NET, какой цикл выполняется быстрее: for или foreach?
источник
Вы можете повысить производительность, если используете параллельный LINQ для многоядерных процессоров. См. Параллельный LINQ (PLINQ) (MSDN).
источник
Меня заинтересовал этот вопрос, поэтому я только что сделал тест. Использование .NET Framework 4.5.2 на процессоре Intel (R) Core (TM) i3-2328M @ 2,20 ГГц, 2200 МГц, 2 ядра с 8 ГБ оперативной памяти под управлением Microsoft Windows 7 Ultimate.
Похоже, LINQ может быть быстрее, чем для каждого цикла. Вот результаты, которые я получил:
Было бы интересно, если бы некоторые из вас могли скопировать и вставить этот код в консольное приложение и тоже протестировать. Перед тестированием с объектом (Сотрудник) я попробовал тот же тест с целыми числами. LINQ там тоже был быстрее.
источник
Exists=True Time=184 Exists=True Time=135
это на ноутбуке Apache Gaming (Win 10, C # 7.3). Скомпилирован и запущен в режиме отладки. Если я переверну тесты, я получуExists=True Time=158 Exists=True Time=194
. Думаю, Linq более оптимизирован.На самом деле это довольно сложный вопрос. Linq делает определенные вещи очень простыми, и если вы их реализуете самостоятельно, вы можете споткнуться (например, linq .Except ()). Это особенно относится к PLinq, и особенно к параллельной агрегации, реализованной в PLinq.
В общем, для идентичного кода linq будет медленнее из-за накладных расходов на вызов делегата.
Однако если вы обрабатываете большой массив данных и применяете относительно простые вычисления к элементам, вы получите огромный прирост производительности, если:
Вы используете цикл for для доступа к каждому элементу (в отличие от foreach или linq).
источник