Производительность 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 выполнить огромное количество двойной работы.