Measure-Command: Hız karşılaştırması (Foreach ve Foreach-Object)
Measure-Command, bir komutun veya komut dosyasının tamamlanmasının ne kadar sürdüğünü ölçer. Bu, özellikle büyük miktarda verinin işlenmesinde önemlidir.
Ölç-Komut
Bu ilk örnekte Get-ChildItem komutunu Windows.txt dosya adındaki tüm dosyaları arayarak ölçüyorum.
Measure-Command {Get-Childitem -Path c: -File -Recurse -ErrorAction SilentlyContinue | Where-Object Name -eq "Windows"}Yaklaşık 44 saniye sürdü. Bu çok hızlı. Bir SSD'm var.
Mukayese
Foreach-Nesne
Şimdi Foreach-Object ile başka bir komutu ölçelim:
Measure-Command {0..1000000 | Foreach-Object $_}8 saniye. Fena değil.
Her biri için
Eğer aynısını Foreach-Object yerine foreach ile yaparsam, çok daha hızlı olduğumu kabul etmem gerekir.
$i=0
Measure-Command {foreach ($i in 0..1000000) {$i++}}
3,5 saniye. Microsoft bunun neden böyle olduğunu açıklıyor:
https://blogs.technet.microsoft.com/heyscriptingguy/2014/07/08/getting-to-know-foreach-and-foreach-object/
Çözüm
Foreach daha fazla bellek tüketir ancak daha hızlıdır. Tüm nesneler hafızada saklanır. Foreach-Object ile nesneler birbiri ardına işlenir ve kanaldan geçen her nesnenin sonuçları anında görüntülenir. Neyse benim favorim Foreach-Object. ?
Daha fazlası: https://www.pluralsight.com/blog/tutorials/measure-powershell-scripts-speed.


