Yanıtlarda atıfta bulunulan performans ölçüm komutlarının herhangi birinden çizim (yanlış) sonuçları. Bir (özel) fonksiyonun veya komutun çıplak çağırma süresine bakmanın yanı sıra dikkate alınması gereken birtakım tuzaklar vardır.
Sjoemelsoftware
'Sjoemelsoftware' 2015 yılının Hollandaca kelimesini
oyladı Sjoemelen hile yapmak anlamına geliyor ve sjoemelsoftware kelimesiVolkswagen emisyon skandalı nedeniyle ortaya çıktı. Resmi tanım "test sonuçlarını etkilemek için kullanılan yazılım" dır.
Şahsen, " Sjoemelsoftware " in test sonuçlarını kopyalamak için her zaman kasıtlı olarak yaratılmadığını, ancak aşağıda gösterildiği gibi test senaryolarına benzer pratik durumlardan kaynaklanabileceğini düşünüyorum.
Bir örnek olarak, listelenen performans ölçüm komutları kullanarak, Language Integrated Query (LINQ) (1) , sıklıkla nitelikli ama kesinlikle her zaman değil, bir şeyler halletmek için oruç tuttuklarını şekilde ve genellikle! Faktör 40 veya daha fazla bir hız artışını ölçen herkesYerel PowerShell komutlarına kıyasla , muhtemelen yanlış ölçüm yapar veya yanlış bir sonuç çıkarır.
Mesele şu ki, tembel bir değerlendirme ( ertelenmiş yürütme olarak da adlandırılır ) kullanan bazı .Net sınıfları (LINQ gibi ) ). Bu, bir değişkene bir ifade atarken neredeyse anında yapıldığı anlaşılır, ancak aslında henüz hiçbir şey işlemedi!
Eğer farz edelim nokta kaynak için . .\Dosomething.ps1
ya bir PowerShell veya daha sofistike Linq ifade var komutu (açıklama kolaylığı için, doğrudan doğrudan ifadeleri gömülü olan Measure-Command
):
$Data = @(1..100000).ForEach{[PSCustomObject]@{Index=$_;Property=(Get-Random)}}
(Measure-Command {
$PowerShell = $Data.Where{$_.Index -eq 12345}
}).totalmilliseconds
864.5237
(Measure-Command {
$Linq = [Linq.Enumerable]::Where($Data, [Func[object,bool]] { param($Item); Return $Item.Index -eq 12345})
}).totalmilliseconds
24.5949
Sonuç açık görünüyor, sonraki Linq komutu ilk PowerShell komutundan yaklaşık 40 kat daha hızlı . Ne yazık ki, o kadar basit değil ...
Sonuçları görüntüleyelim:
PS C:\> $PowerShell
Index Property
----- --------
12345 104123841
PS C:\> $Linq
Index Property
----- --------
12345 104123841
Beklendiği gibi, sonuçlar aynıdır, ancak yakından dikkat ettiyseniz, $Linq
sonuçların ve sonuçların görüntülenmesinin çok daha uzun sürdüğünü fark etmiş olacaksınız $PowerShell
.
En spesifik olarak ölçmek edelim o sadece sonuçlandı nesnenin bir özelliğini alarak:
PS C:\> (Measure-Command {$PowerShell.Property}).totalmilliseconds
14.8798
PS C:\> (Measure-Command {$Linq.Property}).totalmilliseconds
1360.9435
Nesnenin bir nesneden sonra nesnenin bir özelliğini almak yaklaşık 90 kat daha uzun sürdü ve bu sadece tek bir nesneydi!$Linq
$PowerShell
Ayrıca, tekrar yaparsanız, belirli adımların öncekinden çok daha hızlı görünebileceği başka bir tuzağa dikkat edin, bunun nedeni bazı ifadelerin önbelleğe alınmasıdır.
Sonuç olarak, iki işlev arasındaki performansı karşılaştırmak istiyorsanız, bunları kullanılan durumunuza uygulamanız, yeni bir PowerShell oturumuyla başlamanız ve sonucunuzu tam çözümün gerçek performansına dayandırmanız gerekir.
(1) PowerShell ve LINQ hakkında daha fazla arka plan ve örnekler için, şu siteyi tavsiye ederim: LINQ ile Yüksek Performanslı PowerShell
(2) Tembel değerlendirme ile sonuç gerektiği gibi hesaplandığında , iki kavram arasında küçük bir fark olduğunu düşünüyorum . ertelenmiş yürütme sonucu, sistem boştayken hesaplanır