Скажем, у вас есть $output
через некоторую функцию (gci
в вашем случае), и вас интересует поле $output.Matches
.
Если вы запускаете $output | select Matches
(пример 1), вы запускаете оператор Foreach-Object
для каждого объекта в вашем массиве. Этот конвейер будет использовать некоторое ОЗУ (действительно очень ограниченное), которое используется в последовательном вычислении, поэтому каждый объект $ output обрабатывается один за другим.
Если вы запустите $output.Matches
(пример 2), вы выбираете поле из массива. При этом одновременно будет использоваться много оперативной памяти, но поле будет обрабатываться как один большой объект вместо множества маленьких объектов.
Что касается производительности. Как всегда, обратите внимание, что PowerShell не подходит для go, если вам нужна высокая производительность. Он никогда не был разработан, чтобы быть быстрым языком программирования.
При использовании небольших объектов (например, gci $env:userprofile\Desktop
) снижение производительности будет небольшим. При использовании больших объектов или использовании большого количества вложенных каналов производительность будет большой.
Я только что проверил ее с gci Z:\ -recurse
, когда Z: \ является сетевым диском. В этом конкретном случае c производительность падает с коэффициентом 20. (Используйте Measure-Command
, чтобы проверить это.)