Apakah ada cara sederhana untuk menentukan waktu pelaksanaan perintah di PowerShell, seperti perintah 'waktu' di Linux?
Saya datang dengan ini:
$s=Get-Date; .\do_something.ps1 ; $e=Get-Date; ($e - $s).TotalSeconds
Tapi saya ingin sesuatu yang lebih sederhana
time .\do_something.ps1
powershell
time
performance-testing
Paolo Tedesco
sumber
sumber
time { ping -n 1 google.com } -Samples 10
akan menjalankan perintah10
kali dan mengembalikan waktu rata-rata, minimum dan maksimum yang diambil. Anda dapat menambahkan-Silent
untuk menelan STDOUT.$t = Measure-Command {<<your command or code block>>}
. Mencobanya dan kemudian ketik$t
pada prompt untuk melihat hasil Anda dan semua properti Anda memiliki akses ke, seperti$t.Milliseconds
,$t.TotalSeconds
, dll Kemudian kita dapat menulis ke output apapun yang kita inginkan, misalnya,Write-Host That command took $t.TotalSeconds to complete.
Anda juga bisa mendapatkan perintah terakhir dari histori dan mengurangi
EndExecutionTime
dari ituStartExecutionTime
.sumber
Get-History | Group {$_.StartExecutionTime.Hour} | sort Count -desc
untuk melihat pola penggunaan PowerShell Anda menurut jam sehari. :-)$command = Get-History -Count 1 ; "{0}" -f ($command.EndExecutionTime - $command.StartExecutionTime)
Menggunakan
Measure-Command
Contoh
Pipa untuk
Out-Host
memungkinkan Anda melihat output dari perintah, yang jika tidak dikonsumsi olehMeasure-Command
.sumber
Measure-Command {<your command } | Out-Host
- Tuan Rumah berada di luar blok skripSederhana
kemudian bisa digunakan sebagai
Anda mungkin ingin mengubah output
sumber
Measure-Command
menyembunyikan output perintah, jadi solusi ini terkadang lebih baik.Inilah fungsi yang saya tulis yang bekerja mirip dengan
time
perintah Unix :Sumber: https://gist.github.com/bender-the-greatest/741f696d965ed9728dc6287bdd336874
sumber
Measure-Command
atau salah satu dari berbagai cara lain yang dapat Anda lakukan saat eksekusi di Powershell. Jika Anda membaca pertanyaan aslinya, ia meminta sesuatu yang berfungsi "sepertitime
perintah di Linux".Menggunakan Stopwatch dan memformat waktu yang telah berlalu:
Sampel Penggunaan
sumber
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
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 dalamMeasure-Command
):Hasilnya tampak jelas, perintah Linq selanjutnya adalah sekitar 40 kali lebih cepat dari perintah PowerShell pertama . Sayangnya, tidak sesederhana itu ...
Mari kita tampilkan hasilnya:
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:
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
sumber