Saya ingin mengukur waktu yang diperlukan untuk mengulangi menjalankan suatu fungsi. Apakah
replicate()
dan menggunakan for-loop setara? Sebagai contoh:system.time(replicate(1000, f())); system.time(for(i in 1:1000){f()});
Yang merupakan metode yang disukai.
Dalam output
system.time()
, apakahsys+user
waktu CPU sebenarnya untuk menjalankan program? Apakahelapsed
ukuran kinerja waktu program yang baik?
36
Jawaban:
Untuk penentuan waktu program yang efektif, terutama ketika Anda tertarik untuk membandingkan solusi alternatif, Anda perlu kontrol! Cara yang baik adalah dengan menempatkan prosedur yang Anda timing ke dalam suatu fungsi. Panggil fungsi dalam loop waktu. Tulis prosedur rintisan, pada dasarnya dengan menghapus semua kode dari fungsi Anda dan baru saja kembali darinya (tetapi tinggalkan semua argumen). Masukkan rintisan ke loop waktu Anda dan ulang waktu. Ini mengukur semua overhead yang terkait dengan waktu. Kurangi waktu rintisan dari waktu prosedur untuk mendapatkan jaring: ini harus menjadi ukuran akurat dari waktu aktual yang dibutuhkan.
Karena sebagian besar sistem saat ini dapat terputus secara permanen, penting untuk melakukan beberapa pengaturan waktu untuk memeriksa variabilitas. Alih-alih melakukan satu jangka panjang detik, lakukan berjalan masing-masing sekitar detik. Ini membantu untuk melakukan ini dalam satu lingkaran ganda sekaligus. Tidak hanya itu lebih mudah untuk ditangani, itu memperkenalkan sedikit korelasi negatif di setiap seri waktu, yang sebenarnya meningkatkan perkiraan.m N / mN m N/ m
Dengan menggunakan prinsip-prinsip dasar desain eksperimental ini, Anda pada dasarnya mengontrol setiap perbedaan karena cara Anda menggunakan kode (misalnya, perbedaan antara loop untuk dan replikasi ()). Itu membuat masalah Anda hilang.
sumber
Mengenai dua poin Anda:
replicate()
karena fungsional.elapsed
, yaitu angka ketiga.Yang sering saya lakukan adalah
untuk mendapatkan rata-rata dipangkas dari 90% dari N pengulangan menelepon
f()
.(Diedit, dengan terima kasih kepada Hadley karena telah menangkap thinko.)
sumber
mean(replicate(N, system.time(f(...))[3]), trim = 0.05)
?Anda juga dapat mengatur waktu dengan timesteps yang dikembalikan oleh
Sys.time
; ini tentu saja mengukur walltime, jadi waktu perhitungan real time. Kode contoh:sumber
Mengenai metrik waktu yang digunakan, saya tidak bisa menambahkan ke responden lain.
Mengenai fungsi yang digunakan, saya suka menggunakan benchmark dari paket rbenchmark .
sumber
Mereka melakukan hal yang berbeda. Waktu apa yang ingin Anda lakukan. replicate () mengembalikan vektor hasil dari setiap eksekusi fungsi. Untuk loop tidak. Karena itu, itu bukan pernyataan yang setara.
Selain itu, tentukan sejumlah cara agar Anda ingin sesuatu dilakukan. Maka Anda dapat menemukan metode yang paling efisien.
sumber