Measure-Command: Сравнение скорости (Foreach против Foreach-Object)
Команда Measure-Command измеряет, сколько времени требует выполнение команды или скрипта. Это особенно важно для обработки больших объемов данных.
Measure-Command
В этом первом примере я измеряю команду Get-ChildItem, ищя все файлы с именем файла Windows.
Measure-Command {Get-Childitem -Path c: -File -Recurse -ErrorAction SilentlyContinue | Where-Object Name -eq "Windows"}Это заняло около 44 секунд. Это быстро. У меня есть SSD.
Сравнение
Foreach-Object
Теперь давайте измерим другую команду с помощью Foreach-Object:
Measure-Command {0..1000000 | Foreach-Object $_}8 секунд. Неплохо.
Для каждого
Если я сделаю то же самое с foreach вместо Foreach-Object, тогда мне нужно признать, что я гораздо быстрее.
$i=0
Measure-Command {foreach ($i in 0..1000000) {$i++}}
3,5 секунды. Microsoft объясняет, почему это так:
https://blogs.technet.microsoft.com/heyscriptingguy/2014/07/08/getting-to-know-foreach-and-foreach-object/
Заключение
Цикл Foreach потребляет больше памяти, но работает быстрее. Все объекты хранятся в памяти. С помощью Foreach-Object объекты обрабатываются последовательно, и результаты для каждого объекта, проходящего через конвейер, выводятся моментально. В любом случае, мой фаворит - Foreach-Object. 😉
Дополнительная информация: https://www.pluralsight.com/blog/tutorials/measure-powershell-scripts-speed.


