Czas wykonania funkcji pomiarowej w R

282

Czy istnieje znormalizowany sposób pomiaru czasu wykonania funkcji w R?

Oczywiście mogę wziąć system.timeprzed i po wykonaniu, a następnie wziąć różnicę między nimi, ale chciałbym wiedzieć, czy istnieje jakiś znormalizowany sposób lub funkcja (nie chciałbym wymyślać koła).


Wydaje mi się, że pamiętam, że kiedyś użyłem czegoś takiego:

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
źródło
2
Myślę, że miałeś proc.timena myśli przyczynę, system.timektórej potrzebujesz.
Marek
1
Przy większych funkcjach Rprofjest miło. Zapewnia profil wszystkich procesów w części / funkcji kodu.
Rich Scriven
38
Nowi użytkownicy R znajdujący to pytanie za pośrednictwem Google: require(microbenchmark)jest teraz (od kilku lat) standardowym sposobem społeczności na mierzenie czasu. times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark). To robi statystycznego porównania lmvs glmponad 1000 prób, zamiast system.timetestowania tylko raz.
izomorfizmy
użyj, res <- microbenchmark(your code1,your code2)a następnie, print(res)aby zobaczyć tabelę lub ggplot2::autoplot(res)wykres pudełkowy! ref
Travis,

Odpowiedzi:

253

Innym możliwym sposobem zrobienia tego byłoby użycie Sys.time ():

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

Nie jest to najbardziej elegancki sposób na zrobienie tego w porównaniu do powyższej odpowiedzi, ale zdecydowanie sposób na zrobienie tego.

Shreyes
źródło
14
Jest to znacznie bardziej wydajne pod względem pamięci, niż system.time (), który skutecznie kopiuje swoje argumenty. Jest to ważne, gdy masz do czynienia z danymi, które ledwo mieszczą się w twojej pamięci RAM.
Adam Ryczkowski,
2
Dla osób, które używają Sys.time, przeczytaj to dla pewnego zastrzeżenia: Czas R kod za pomocą Sys.time ()
李哲源
1
system.time()było dla mnie szybsze. Myślę, że ta odpowiedź system.time()powinna zostać zaakceptowana!
Gwang-Jin Kim
Jest to mój preferowany sposób, aby poznać czas potrzebny na długie obliczenia wykonywane równolegle na wielu rdzeniach. W takim przypadku czas zegara ściennego mierzony za pomocą tego połączenia jest wystarczająco dokładny, ponieważ komputer będzie znacznie bardziej obciążony, ponieważ wszystkie rdzenie będą obliczać, niż robić cokolwiek innego, a obliczenia zajmują minuty lub godziny. Jest to bardzo konkretny przypadek użycia, ale warto o nim wspomnieć.
Pablo Adames
186

Wbudowana funkcja system.time()to zrobi.

Użyj jak: system.time(result <- myfunction(with, arguments))

Andrie
źródło
1
Ważne jest wiedzieć, że system.time()ma argument gcFirst, który jest TRUEdomyślnie. To z jednej strony sprawia, że ​​pomiar jest nieco bardziej powtarzalny, ale może generować znaczny narzut całkowitego czasu pracy (który nie jest mierzony, oczywiście).
jakob-r
2
w jakiej jednostce jest to mierzone? na przykład właśnie pobiegłem system.time(result <- myfunction(with, arguments))i otrzymałem 187,564 jako wynik - czy to w kilka sekund czy co?
zsad512,
Dla osób, które używają system.time, przeczytaj to, aby uzyskać pewne zastrzeżenie: błędy „nie znaleziono obiektu” i „nieoczekiwany symbol” podczas pomiaru kodu R za pomocą system.time () .
李哲源
@ zsad512 Jestem pewien, że są to sekundy .
Tapper
58

Jak powiedział Andrie, system.time()działa dobrze. Dla krótkiej funkcji wolę w to wstawić replicate():

system.time( replicate(10000, myfunction(with,arguments) ) )
Sacha Epskamp
źródło
28
Lepiej jest korzystać z pakietu mikrodruku, ponieważ nie obejmuje on czasu replikacji.
hadley,
37

Nieco lepszym sposobem mierzenia czasu wykonania jest użycie pakietu rbenchmark . Ten pakiet (łatwo) pozwala określić, ile razy należy powtórzyć test i czy powinien to być względny test porównawczy.

Zobacz także powiązane pytanie na stronie stats.stackexchange

csgillespie
źródło
6
Znak Microbenchmark jest jeszcze lepszy, ponieważ wykorzystuje funkcje o wyższej precyzji pomiaru czasu.
hadley,
4
@hadley Ale rbenchmark jest bardziej przyjazny dla użytkownika w przypadku porównań. Dla mnie microbenchmark to uaktualniony system.time. Potrzebujemy rmicrobenchmark :)
Marek
3
Opiekun mikrodruku jest dość responsywny - założę się, że dodałby wszystko, czego potrzebujesz.
hadley,
34

microbenchmark jest lekkim (~ 50kB) pakietem i mniej więcej standardowym sposobem w R do testowania wielu wyrażeń i funkcji:

microbenchmark(myfunction(with,arguments))

Na przykład:

> 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

Tutaj oba wyrażenia zostały ocenione 10000 razy, a średni czas wykonania wynosił około 25-30 ns.

Davor Josipovic
źródło
32

Jest również proc.time()

Możesz używać w ten sam sposób, Sys.timeale daje to podobny wynik system.time.

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

główna różnica między używaniem

system.time({ #your function here })

jest to, że proc.time()metoda nadal ma wykonywać swoją funkcję, a nie tylko pomiar czasu ... a przy okazji, chciałbym skorzystać system.timez {}wewnątrz, dzięki czemu można umieścić zestaw rzeczy ...

Rodrigo de Alexandre
źródło
25

Pakiet „tictoc” zapewnia bardzo prosty sposób pomiaru czasu wykonania. Dokumentacja znajduje się w: https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf .

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

Aby zapisać upływający czas w zmiennej, możesz:

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
exectime <- toc()
exectime <- exectime$toc - exectime$tic
Anton
źródło
18

Chociaż inne funkcje są przydatne dla jednej funkcji, zalecam następujący fragment kodu, który jest bardziej ogólny i skuteczny:

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))
TPArrow
źródło
2
Do tej pory nie wiedziałem o Rprof i jest naprawdę świetny! plus jest dostarczany z podstawą R, więc nie ma potrzeby dodatkowego pakietu jako microbenchmarklub profvis.
Simon C.
Zastanawiam się, czy rprof może być również wizualizowany, na przykład jeśli chcemy wykreślić czas dla każdego profilowanego elementu?
Zawir Amin
@ZawirAmin Jest sposób, wystarczy użyć Rstudio >> menu profilu
TPArrow
13

Innym prostym, ale bardzo skutecznym sposobem na to jest użycie pakietu profvis. Nie tylko mierzy czas wykonania kodu, ale daje dogłębną analizę każdej wykonywanej funkcji. Można go również użyć do Shiny.

library(profvis)

profvis({
  #your code here
})

Kliknij tutaj, aby zobaczyć kilka przykładów.

gianni
źródło
11

Możesz użyć stylu MATLAB tic - tocfunkcje, jeśli wolisz. Zobacz inne pytanie SO

Funkcja stopera w R.

Richie Cotton
źródło
proc.time()Już miałam dodać … Bardziej podoba mi się ta urocza nazwa. =)
izomorfizmy