Ausführungszeit der Messfunktion in R.

282

Gibt es in R eine standardisierte Methode zur Messung der Ausführungszeit der Funktion?

Natürlich kann ich system.timevor und nach der Ausführung nehmen und dann den Unterschied davon nehmen, aber ich würde gerne wissen, ob es einen standardisierten Weg oder eine standardisierte Funktion gibt (möchte das Rad nicht erfinden).


Ich scheine mich zu erinnern, dass ich einmal etwas wie das Folgende benutzt habe:

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
quelle
2
Ich denke, Sie hatten proc.timeim Sinn, weil system.timeSie eine brauchen.
Marek
1
Für größere Funktionen Rprofist schön. Es bietet ein Profil aller Prozesse in einem Codeblock / einer Codefunktion.
Rich Scriven
38
Neue R-Benutzer, die diese Frage über Google finden: require(microbenchmark)ist jetzt (seit ein paar Jahren) der Community-Standard für die Zeitmessung. times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark). Dies macht einen statistischen Vergleich der lmgegen glmüber 1000 versucht, anstatt system.timenur einmal zu testen.
Isomorphismen
benutze res <- microbenchmark(your code1,your code2)und dann print(res), um eine Tabelle oder ggplot2::autoplot(res)ein Boxplot zu sehen! ref
Travis

Antworten:

253

Eine andere Möglichkeit wäre die Verwendung von Sys.time ():

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

Nicht die eleganteste Art, es zu tun, verglichen mit der obigen Antwort, aber definitiv eine Art, es zu tun.

Shreyes
quelle
14
Dies ist viel speichereffizienter als system.time (), das seine Argumente effektiv kopiert. Dies ist wichtig, wenn Sie mit Daten arbeiten, die kaum in Ihren Arbeitsspeicher passen.
Adam Ryczkowski
2
Für Leute, die verwenden Sys.time, lesen Sie bitte diese für einige Einschränkung: Timing R-Code mit Sys.time ()
李哲源
1
system.time()war schneller für mich. Ich denke, dass die Antwort für system.time()akzeptiert werden sollte!
Gwang-Jin Kim
Dies ist meine bevorzugte Methode, um die Zeit zu ermitteln, die für eine lange parallele Berechnung auf mehreren Kernen erforderlich ist. In diesem Fall ist die durch diesen Anruf gemessene Wanduhrzeit genau genug, da der Computer mit allen berechneten Kernen viel mehr zu tun hat als alles andere und die Berechnungen Minuten oder Stunden dauern. Dies ist ein sehr spezifischer Anwendungsfall, der jedoch erwähnenswert ist.
Pablo Adames
186

Die eingebaute Funktion system.time()wird es tun.

Verwenden Sie wie: system.time(result <- myfunction(with, arguments))

Andrie
quelle
1
Es ist wichtig zu wissen, dass system.time()es ein Argument gibt, gcFirstdas TRUEstandardmäßig verwendet wird. Dies macht einerseits die Messung etwas reproduzierbarer, kann jedoch einen erheblichen Overhead der Gesamtlaufzeit erzeugen (was natürlich nicht gemessen wird).
Jakob-R
2
In welcher Einheit wird das gemessen? Zum Beispiel bin ich gerade gelaufen system.time(result <- myfunction(with, arguments))und habe 187.564 als Ausgabe erhalten - ist das in Sekunden oder was?
Zsad512
Für Menschen , die nutzen system.time, lesen Sie bitte für einige Einschränkung: „Objekt nicht gefunden“ und „unerwartetes Symbol“ Fehler beim Timing R Code mit system.time () .
13.
@ zsad512 Ich bin mir ziemlich sicher, dass das Sekunden sind .
Tapper
58

Wie Andrie sagte, system.time()funktioniert gut. Für eine kurze Funktion ziehe ich replicate()es vor:

system.time( replicate(10000, myfunction(with,arguments) ) )
Sacha Epskamp
quelle
28
Sie sollten das Microbenchmark-Paket besser verwenden, da es den Replikationsaufwand nicht im Timing berücksichtigt.
Hadley
37

Eine etwas schönere Methode zur Messung der Ausführungszeit ist die Verwendung des Pakets rbenchmark . Mit diesem Paket können Sie (einfach) angeben, wie oft Ihr Test repliziert werden soll und wie hoch der relative Benchmark sein soll.

Siehe auch eine verwandte Frage unter stats.stackexchange

csgillespie
quelle
6
Microbenchmark ist sogar noch besser, da es Timing-Funktionen mit höherer Präzision verwendet.
Hadley
4
@hadley Aber rbenchmark ist bei Vergleichen benutzerfreundlicher. Für mich ist microbenchmark system.time aktualisiert. rmicrobenchmark ist was wir brauchen :)
Marek
3
Der Betreuer von microbenchmark ist ziemlich reaktionsschnell - ich wette, er würde alles hinzufügen, was Sie brauchen.
Hadley
34

microbenchmark ist ein leichtes (~ 50 kB) Paket und mehr oder weniger eine Standardmethode in R zum Benchmarking mehrerer Ausdrücke und Funktionen:

microbenchmark(myfunction(with,arguments))

Beispielsweise:

> 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

Hier wurden beide Ausdrücke 10000 Mal ausgewertet, wobei die mittlere Ausführungszeit etwa 25 bis 30 ns betrug.

Davor Josipovic
quelle
32

Es gibt auch proc.time()

Sie können auf die gleiche Weise wie verwenden, Sys.timeaber es gibt Ihnen ein ähnliches Ergebnis wie system.time.

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

der Hauptunterschied zwischen der Verwendung

system.time({ #your function here })

ist, dass die proc.time()Methode Ihre Funktion immer noch ausführt, anstatt nur die Zeit zu messen ... und übrigens, ich verwende sie gerne system.timemit {}inside, damit Sie eine Reihe von Dingen einfügen können ...

Rodrigo de Alexandre
quelle
25

Das Paket "tictoc" bietet Ihnen eine sehr einfache Möglichkeit, die Ausführungszeit zu messen. Die Dokumentation finden Sie unter: https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf .

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

So speichern Sie die verstrichene Zeit in einer Variablen:

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

Obwohl andere Lösungen für eine einzelne Funktion nützlich sind, empfehle ich den folgenden Code, der allgemeiner und effektiver ist:

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))
TPArrow
quelle
2
Ich wusste bis jetzt nichts über Rprof und es ist in der Tat großartig! Außerdem wird die Basis R mitgeliefert, sodass kein zusätzliches Paket als microbenchmarkoder erforderlich ist profvis.
Simon C.
Ich frage mich, ob rprof auch visualisiert werden kann, wie zum Beispiel, wenn wir die Zeit für jedes Element zeichnen möchten, das es profiliert.
Zawir Amin
@ZawirAmin Es gibt einen Weg, benutze einfach Rstudio >> Profilmenü
TPArrow
13

Eine andere einfache, aber sehr leistungsfähige Möglichkeit, dies zu tun, ist die Verwendung des Pakets profvis. Es misst nicht nur die Ausführungszeit Ihres Codes, sondern gibt Ihnen auch einen Drilldown für jede Funktion, die Sie ausführen. Es kann auch für Shiny verwendet werden.

library(profvis)

profvis({
  #your code here
})

Klicken Sie hier für einige Beispiele.

Gianni
quelle
11

Sie können MATLAB-Stil verwenden tic- tocFunktionen, wenn Sie es vorziehen. Siehe diese andere SO-Frage

Stoppuhrfunktion in R.

Richie Cotton
quelle
Wollte gerade hinzufügen proc.time()... Ich mag den süßen Namen besser. =)
Isomorphismen