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

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.


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))


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) ) )

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


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.


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 ...


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

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))

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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.