Mikor érdemes ezeket a metódusokat használni?

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.



Word To HTML Converter