Mengukur waktu eksekusi fungsi di R

282

Apakah ada cara standar dalam R mengukur waktu eksekusi fungsi?

Jelas saya dapat mengambil system.timesebelum dan sesudah eksekusi dan kemudian mengambil perbedaannya, tetapi saya ingin tahu apakah ada beberapa cara atau fungsi standar (ingin tidak menemukan roda).


Sepertinya saya ingat bahwa saya pernah menggunakan sesuatu seperti di bawah ini:

somesysfunction("myfunction(with,arguments)")
> Start time : 2001-01-01 00:00:00  # output of somesysfunction
> "Result" "of" "myfunction"        # output of myfunction
> End time : 2001-01-01 00:00:10    # output of somesysfunction
> Total Execution time : 10 seconds # output of somesysfunction
dns
sumber
2
Saya pikir Anda ada proc.timedi pikiran sebab system.timeadalah salah satu yang Anda butuhkan.
Marek
1
Untuk fungsi yang lebih besar, Rprofbagus. Ini memberikan profil dari semua proses dalam sepotong kode / fungsi.
Rich Scriven
38
Pengguna R baru yang menemukan pertanyaan ini melalui google: require(microbenchmark)sekarang (sejak beberapa tahun yang lalu) adalah cara standar komunitas untuk menentukan waktu. times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark). Ini melakukan statistik perbandingan lmvs glmlebih dari 1000 mencoba, daripada system.timepengujian hanya sekali.
isomorfisma
gunakan res <- microbenchmark(your code1,your code2)dan kemudian print(res)untuk melihat tabel atau ggplot2::autoplot(res)untuk melihat boxplot! ref
Travis

Jawaban:

253

Cara lain yang memungkinkan untuk melakukan ini adalah dengan menggunakan Sys.time ():

start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

Bukan cara yang paling elegan untuk melakukannya, dibandingkan dengan jawaban di atas, tetapi jelas cara untuk melakukannya.

Shreyes
sumber
14
Ini jauh lebih hemat memori, kemudian system.time (), yang secara efektif menyalin argumennya. Penting ketika Anda berurusan dengan data yang pas dengan RAM Anda.
Adam Ryczkowski
2
Untuk orang yang menggunakan Sys.time, silakan baca ini untuk beberapa peringatan: Kode waktu R dengan Sys.time ()
李哲源
1
system.time()lebih cepat bagi saya. Saya pikir jawaban itu system.time()harus diterima!
Gwang-Jin Kim
Ini adalah cara pilihan saya untuk mengetahui waktu yang dibutuhkan untuk perhitungan panjang yang dilakukan secara paralel pada banyak core. Dalam hal ini, waktu jam dinding yang diukur melalui panggilan ini cukup akurat karena komputer akan jauh lebih sibuk dengan semua core menghitung daripada melakukan hal lain dan perhitungan membutuhkan beberapa menit atau jam untuk menyelesaikannya. Ini adalah kasus penggunaan yang sangat spesifik tetapi perlu disebutkan.
Pablo Adames
186

Fungsi bawaan system.time()akan melakukannya.

Gunakan seperti: system.time(result <- myfunction(with, arguments))

Andrie
sumber
1
Penting untuk diketahui adalah yang system.time()memiliki argumen gcFirstyang secara TRUEdefault. Ini di satu sisi membuat pengukuran sedikit lebih dapat direproduksi tetapi dapat menghasilkan overhead yang signifikan dari total waktu run (yang tidak diukur, tentunya).
jakob-r
2
unit apa yang diukur ini? misalnya saya hanya berlari system.time(result <- myfunction(with, arguments))dan mendapat 187.564 sebagai output - apakah itu dalam hitungan detik atau apa?
zsad512
Untuk orang-orang yang menggunakan system.time, harap baca ini untuk beberapa peringatan: kesalahan "objek tidak ditemukan" dan "simbol tak terduga" ketika timing kode R dengan system.time () .
李哲源
@ zsad512 Saya cukup yakin bahwa itu adalah detik .
Penyadap
58

Seperti yang dikatakan Andrie, system.time()bekerja dengan baik. Untuk fungsi pendek, saya lebih suka memasukkan replicate():

system.time( replicate(10000, myfunction(with,arguments) ) )
Sacha Epskamp
sumber
28
Anda lebih baik menggunakan paket microbenchmark karena tidak termasuk biaya overhead replika dalam pengaturan waktu.
Hadley
37

Cara yang sedikit lebih baik untuk mengukur waktu eksekusi, adalah dengan menggunakan paket rbenchmark . Paket ini (mudah) memungkinkan Anda menentukan berapa kali mereplikasi tes Anda dan akan menjadi patokan relatif seharusnya.

Lihat juga pertanyaan terkait di stats.stackexchange

csgillespie
sumber
6
Microbenchmark bahkan lebih baik karena menggunakan fungsi timing presisi yang lebih tinggi.
Hadley
4
@hadley But rbenchmark lebih ramah pengguna dalam hal perbandingan. Bagi saya microbenchmark adalah peningkatan system.time. rmicrobenchmark adalah apa yang kita butuhkan :)
Marek
3
Pemelihara microbenchmark cukup responsif - saya yakin dia akan menambahkan apa pun yang Anda butuhkan.
Hadley
34

microbenchmark adalah paket ringan (~ 50kB) dan lebih-atau-kurang cara standar dalam R untuk membandingkan berbagai ekspresi dan fungsi:

microbenchmark(myfunction(with,arguments))

Sebagai contoh:

> microbenchmark::microbenchmark(log10(5), log(5)/log(10), times = 10000)
Unit: nanoseconds
           expr min lq    mean median uq   max neval cld
       log10(5)   0  0 25.5738      0  1 10265 10000   a
 log(5)/log(10)   0  0 28.1838      0  1 10265 10000

Di sini kedua ekspresi dievaluasi 10.000 kali, dengan waktu eksekusi rata-rata sekitar 25-30 ns.

Davor Josipovic
sumber
32

Ada juga proc.time()

Anda dapat menggunakan dengan cara yang sama seperti Sys.timetetapi memberi Anda hasil yang mirip dengan system.time.

ptm <- proc.time()
#your function here
proc.time() - ptm

perbedaan utama antara menggunakan

system.time({ #your function here })

adalah bahwa proc.time()metode ini masih menjalankan fungsi Anda bukan hanya mengukur waktu ... dan omong-omong, saya suka menggunakan system.timedengan {}di dalam sehingga Anda dapat menempatkan satu set hal ...

Rodrigo de Alexandre
sumber
25

Paket "tictoc" memberi Anda cara yang sangat sederhana untuk mengukur waktu eksekusi. Dokumentasinya ada di: https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf .

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
toc()

Untuk menghemat waktu yang telah berlalu ke dalam variabel, Anda dapat melakukan:

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
exectime <- toc()
exectime <- exectime$toc - exectime$tic
Anton
sumber
18

Meskipun solusi lain berguna untuk fungsi tunggal, saya merekomendasikan potongan kode berikut ini di mana lebih umum dan efektif:

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))
TPArrow
sumber
2
Saya tidak tahu tentang Rprof sampai sekarang dan ini memang hebat! ditambah lagi dengan basis R jadi tidak perlu paket tambahan seperti microbenchmarkatau profvis.
Simon C.
Saya ingin tahu apakah rprof dapat divisualisasikan juga, seperti misalnya jika kita ingin merencanakan waktu untuk setiap item yang diprofilkan?
Zawir Amin
@ZawirAmin Ada caranya, cukup gunakan menu profil Rstudio >>
TPArrow
13

Cara lain yang sederhana namun sangat kuat untuk melakukan ini adalah dengan menggunakan paket profvis. Itu tidak hanya mengukur waktu eksekusi kode Anda tetapi memberi Anda menelusuri untuk setiap fungsi yang Anda jalankan. Ini dapat digunakan untuk Shiny juga.

library(profvis)

profvis({
  #your code here
})

Klik di sini untuk beberapa contoh.

gianni
sumber
11

Anda dapat menggunakan fungsi tic- tocfungsi MATLAB , jika diinginkan. Lihat pertanyaan SO lainnya ini

Fungsi stopwatch di R

Richie Cotton
sumber
proc.time()Akan menambahkan ... Saya suka nama lucu lebih baik. =)
isomorfisma