A ForEach() és Where() metódusok helyett használhatjuk a hagyományos ForEach-Object és Where-Object cmdleteket. A fő különbség a kétfajta megoldás között, hogy a cmdletek a csővezetéket használják az elemek adagolására, ami tudvalevőleg elég nagy „overhead”-et okoz, így a feldolgozás várhatólag lassabb, mint a metódusok használata. Ezt ki is tudjuk mérni (a mérésről bővebben a 2.1.14 Stopperoljuk a futási időt és várakozzunk (measure-command, start-sleep, get-history) fejezetben):
PS C:\> $sb1 = {$result1 = 1..10000 | Where-Object {$_ -gt 5000}}
PS C:\> $sb2 = {$result2 = (1..10000).Where({$_ -gt 5000})}
PS C:\> (Measure-Command -Expression $sb1).TotalMilliseconds
698,0462
PS C:\> (Measure-Command -Expression $sb2).TotalMilliseconds
135,8782
Látható, hogy a „Where” jellegű szűrésben kb. ötszörös sebességkülönbség van a metódus javára. Négyszeres különbséget tapasztalunk a „ForEach” feldolgozásban is:
PS C:\> $sb1 = {$result1 = 1..10000 | ForEach-Object {$_*2}}
PS C:\> $sb2 = {$result2 = (1..10000).ForEach({$_*2})}
PS C:\> (Measure-Command -Expression $sb1).TotalMilliseconds
504,1616
PS C:\> (Measure-Command -Expression $sb2).TotalMilliseconds
144,5365
Természetesen itt sem hatékony minden esetben a metódusok használata, hiszen a teljes gyűjteménynek rendelkezésre kell állnia a memóriában ahhoz, hogy a metódust futtatni tudjuk. Ez nagyon nagy gyűjtemények esetében nagyon nagy memóriafoglalást eredményezhet, ami a memória lapozásához vezet, ami lelassítja a feldolgozást.
Szintén nem nyerünk sokat a metódusok használatával, ha a bemeneti objektumok lassan születnek meg, például távoli gépekről vagy lassan olvasható fájlok tartalmából.