Hanya satu kata di gambar (salah) kesimpulan dari salah satu perintah pengukuran kinerja yang disebut dalam jawaban. Ada sejumlah jebakan yang harus dipertimbangkan selain dari melihat ke waktu pemanggilan fungsi (perintah) yang kosong.
Perangkat lunak Sjoemels
'Sjoemelsoftware' memilih kata Belanda tahun 2015
Sjoemelen berarti curang, dan kata sjoemelsoftware muncul karena skandal emisi Volkswagen. Definisi resmi adalah "perangkat lunak yang digunakan untuk memengaruhi hasil tes".
Secara pribadi, saya berpikir bahwa " Sjoemelsoftware " tidak selalu sengaja dibuat untuk menipu hasil tes tetapi mungkin berasal dari mengakomodasi situasi praktis yang mirip dengan kasus uji seperti yang ditunjukkan di bawah ini.
Sebagai contoh, menggunakan perintah pengukuran kinerja yang terdaftar, Integrated Query Language (LINQ) (1) , sering memenuhi syarat seperti yang cara berpuasa untuk mendapatkan sesuatu dilakukan dan itu sering, tetapi tentu tidak selalu! Siapa pun yang mengukur peningkatan kecepatan faktor 40 atau lebih dibandingkan dengan perintah PowerShell asli, mungkin salah mengukur atau menarik kesimpulan yang salah.
Intinya adalah bahwa beberapa kelas .Net (seperti LINQ) menggunakan evaluasi malas (juga disebut sebagai eksekusi ditangguhkan (2) ). Berarti ketika menetapkan ekspresi ke variabel, tampaknya segera dilakukan tetapi sebenarnya belum memproses apa-apa!
Mari kita anggap bahwa Anda dot-source. .\Dosomething.ps1
perintah Anda yang memiliki PowerShell atau ekspresi Linq yang lebih canggih (untuk kemudahan penjelasan, saya telah langsung memasukkan ekspresi langsung ke dalam 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
Hasilnya tampak jelas, perintah Linq selanjutnya adalah sekitar 40 kali lebih cepat dari perintah PowerShell pertama . Sayangnya, tidak sesederhana itu ...
Mari kita tampilkan hasilnya:
PS C:\> $PowerShell
Index Property
----- --------
12345 104123841
PS C:\> $Linq
Index Property
----- --------
12345 104123841
Seperti yang diharapkan, hasilnya sama tetapi jika Anda telah memperhatikan dengan seksama, Anda akan memperhatikan bahwa butuh waktu lebih lama untuk menampilkan $Linq
hasilnya daripada $PowerShell
hasilnya.
Mari kita secara khusus mengukur bahwa dengan hanya mengambil properti dari objek mengakibatkan:
PS C:\> (Measure-Command {$PowerShell.Property}).totalmilliseconds
14.8798
PS C:\> (Measure-Command {$Linq.Property}).totalmilliseconds
1360.9435
Butuh sekitar 90 faktor lebih lama untuk mengambil properti dari $Linq
objek kemudian $PowerShell
objek dan itu hanya satu objek!
Juga perhatikan perangkap lain bahwa jika Anda melakukannya lagi, langkah-langkah tertentu mungkin terlihat jauh lebih cepat daripada sebelumnya, ini karena beberapa ekspresi telah di-cache.
Intinya, jika Anda ingin membandingkan kinerja antara dua fungsi, Anda perlu mengimplementasikannya dalam kasing bekas Anda, mulailah dengan sesi PowerShell yang baru dan simpulkan kesimpulan Anda pada kinerja aktual dari solusi lengkap.
(1) Untuk latar belakang dan contoh lebih lanjut tentang PowerShell dan LINQ, saya sarankan situs ini: PowerShell Kinerja Tinggi dengan LINQ
(2) Saya pikir ada perbedaan kecil antara dua konsep karena dengan evaluasi malas hasilnya dihitung ketika dibutuhkan sebagaimana yang seharusnya. eksekusi yang ditunda adalah hasilnya dihitung ketika sistem idle