Производительность powershell: Get-ChildItem -Include vs. Get-ChildItem | Where-Object

Я попробовал несколько вариантов итерации моих каталогов и получил огромную разницу в производительности между следующими командами:

Медленный:

Get-ChildItem -Directory -Force -Recurse -Depth 3 -Include '$tf'

Быстро:

Get-ChildItem -Directory -Force -Recurse -Depth 3 | Where-Object Name -eq '$tf'

Может ли кто-нибудь объяснить мне, почему первое утверждение намного медленнее, чем второе?

1 ответ

Решение

Get-ChildItem командлет поставщика - это означает, что большая часть его фактической работы выгружается базовому поставщику, вероятно, FileSystem провайдер в вашем случае.

Сам провайдер на самом деле не поддерживает -Include/-Exclude параметры, это одна из немногих вещей, которые командлет берет на себя, и для поставщика файловой системы это очень тяжелая двойная работа, потому что командлет должен пройти через иерархию файловой системы, чтобы выяснить, нужно ли ему применять исключение или включение, основанное на имени родительского каталога, вы можете увидеть, как это реализовано здесь.

Итак, используя -Include по отношению к поставщику файловой системы вы просите PowerShell выполнить огромное количество двойной работы.

Другие вопросы по тегам