Как говорит Джон Скит, оба метода должны будут по сути делать одно и то же - перечислять последовательность при условном увеличении счетчика при совпадении предиката.Любые различия в производительности между ними должны быть незначительными: незначительными практически для всех вариантов использования.Однако, если есть токен-победитель, я бы подумал , что он должен быть первым, поскольку из рефлектора кажется, что перегрузка Count
, которая принимает предикат, использует свой собственный foreach
для перечисления, а не дляболее очевидный способ перевести работу на потоковую передачу Where
в без параметров Count
, как во втором примере.Это означает, что метод № 1, вероятно, имеет две незначительные преимущества производительности:
- Меньше проверок аргументов (нулевые тесты и т. Д.) Проверок.Техника # 2
Count
также проверит, является ли ее (переданный по каналу) вход ICollection
или ICollection<T>
, что не может быть. - Один построенный перечислитель против двух перечислителей, соединенных вместе (у дополнительного конечного автомата есть затраты).
Есть один минор в пользу техники # 2, хотя: Where
немного сложнее при создании перечислителя для исходной последовательности;он использует другой для списков и массивов.Это может сделать его более производительным в определенных сценариях.
Конечно, я должен повторить, что я могу быть просто неправильным относительно моего анализа - рассуждения о производительности через статический коданализ, особенно когда различия могут быть незначительными, не очень хорошая идея.Есть только один способ выяснить это - измерить время выполнения для вашей конкретной установки.
К вашему сведению, источник, который я отражал, был из .NET 3.5 SP1.