производительность PowerShell: Get-ChildItem -Include против Get-ChildItem |Where-Object - PullRequest
0 голосов
/ 12 сентября 2018

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

Slow:

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

Быстро:

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

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

1 Ответ

0 голосов
/ 12 сентября 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...