Saya memiliki dua skrip yang masing-masing menghitung faktorial angka. Saya ingin tahu mana yang lebih cepat. The time
perintah memberi saya milidetik dan hasilnya berbeda dari waktu ke waktu:
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.089s
user 0m0.052s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.091s
user 0m0.048s
sys 0m0.036s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.088s
user 0m0.048s
sys 0m0.040s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.088s
user 0m0.048s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.087s
user 0m0.064s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.089s
user 0m0.068s
sys 0m0.016s
piousbox@piousbox-laptop:~/projects/trash$
Bagaimana saya mengambil waktu rata-rata yang diperlukan untuk menjalankan skrip? Saya dapat mengurai dan rata - rata keluaran 100 time
- an tapi saya membayangkan ada solusi yang lebih baik?
Jawaban:
Tidak, ide Anda tentang rata-rata sudah benar.
Eksekusi skrip tergantung pada banyak faktor, dan bagaimanapun harus dibagi antara waktu setup (memuat interpreter dalam memori, pengaturan, dan mungkin mengkompilasi kode untuk bytecode atau kode mesin) dan waktu eksekusi yang sebenarnya.
Untuk lebih fokus pada waktu eksekusi dalam, Anda melakukan loop dalam skrip itu sendiri (yaitu alih-alih menghitung satu faktorial, Anda menghitungnya 100 kali dalam satu kali eksekusi skrip. Skrip akan diatur sekali, dan rutinitas dalam akan mengeksekusi 100 waktu).
Untuk fokus pada total waktu, Anda menjalankan skrip seratus kali dan rata-rata hasilnya. Idealnya, Anda harus memisahkan eksekusi tersebut cukup sehingga sistem kembali dalam "keadaan referensi" (atau keadaan tidak terkait skrip) setiap kali. Sebagai contoh, juru itu sendiri akan di-cache dalam memori, sehingga pertama pelaksanaan script akan lumayan lambat dari yang berikutnya.
Untuk mendapatkan wawasan yang lebih baik tentang algoritme, saya pikir cara terbaik adalah sesuatu seperti ini (pada mesin idle):
Aplikasi hanya berjalan sekali, semua pengaturan dan pemasangan dilakukan oleh iterasi tanpa batas waktu pertama, jadi ini harus meminimalkan overhead (kecuali mungkin untuk panggilan waktu).
Jika fungsi menerima input, Anda sebaiknya menyediakannya urutan acak input menggunakan PRNG yang diunggulkan dengan nilai tetap, untuk memastikan kedua versi fungsi yang diuji menerima nilai yang sama. Ini menghindari satu fungsi yang tampaknya lebih baik karena "angka keberuntungan" (mis. Saya ingat variasi algoritma Hillsort yang berkinerja lebih baik jika jumlah item yang akan diurutkan dalam bentuk 2 k -1 dengan k kecil ).
sumber
Anda dapat menjalankan iterasi program dalam satu lingkaran; dan bagi total waktu dengan jumlah iterasi:
sumber
{1..10}
sebelumnya dan saya bingung bahwa itu berhasil, tidak dapat menemukannya di manual bash. Satu-satunya hal yang menyedihkan adalah Anda tidak tahu penyebaran hasil Anda (waktu minimum dan maksimum).man -P 'less +/Brace\ Expansion' bash
bash
. Coba jalankan/bin/bash
sebelum ini.ada alat yang disebut multitime yang melakukan hal ini: menjalankan perintah beberapa kali, mengukur berapa lama (real / user / sistem dengan rata-rata, min / maks, dan waktu rata-rata dihitung secara otomatis)
Misalnya, untuk mengukur skrip serupa 100 kali:
sumber
Ini sudah lama tetapi muncul sangat tinggi di google ketika saya mencari perintah yang saya gunakan sebelumnya tetapi tidak dapat menemukan. Bagaimanapun, cara pilihan saya untuk melakukan ini adalah:
Ini memberikan sedikit detail termasuk waktu eksekusi rata-rata tepat di akhir:
sumber
Untuk
-n
,-r
dan opsi lainnya lihat https://docs.python.org/2/library/timeit.html#command-line-interfacesumber
Hyperfine adalah pilihan lain.
Penggunaan sampel:
sumber