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.

İlgili makaleler