Ich möchte die Zeit messen, die benötigt wird, um die Ausführung einer Funktion zu wiederholen. Sind
replicate()
und benutzen for-Schleifen gleichwertig? Beispielsweise:system.time(replicate(1000, f())); system.time(for(i in 1:1000){f()});
Welches ist die bevorzugte Methode.
In der Ausgabe von
system.time()
, istsys+user
die tatsächliche CPU - Zeit , um das Programm zum Laufen? Istelapsed
ein gutes Maß für die Zeitleistung des Programms?
36
Antworten:
Für ein effektives Timing von Programmen, insbesondere wenn Sie alternative Lösungen vergleichen möchten, benötigen Sie eine Steuerung! Ein guter Weg ist, die Prozedur, die Sie planen, in eine Funktion umzuwandeln. Rufen Sie die Funktion innerhalb einer Zeitschleife auf. Schreiben Sie eine Stub-Prozedur, indem Sie im Wesentlichen den gesamten Code aus Ihrer Funktion entfernen und einfach von dieser zurückkehren (lassen Sie jedoch alle Argumente in). Setzen Sie den Stub in Ihre Timing-Schleife ein und wiederholen Sie die Zeit. Hiermit wird der gesamte mit dem Timing verbundene Overhead gemessen. Subtrahieren Sie die Stichzeit von der Eingriffszeit, um das Netz zu erhalten: Dies sollte ein genaues Maß für die tatsächlich benötigte Zeit sein.
Da die meisten Systeme heutzutage ständig unterbrochen werden können, ist es wichtig, mehrere Zeitabläufe durchzuführen, um die Variabilität zu überprüfen. Anstatt einen langen Lauf von Sekunden zu machen, mache Läufe von jeweils etwa Sekunden. Es hilft, dies in einer Doppelschleife auf einmal zu tun. Dies ist nicht nur einfacher zu handhaben, es führt auch ein wenig negative Korrelation in jede Zeitreihe ein, wodurch die Schätzungen tatsächlich verbessert werden.N m N/m
Durch die Verwendung dieser Grundprinzipien des experimentellen Entwurfs können Sie im Wesentlichen die Unterschiede kontrollieren, die sich aus der Bereitstellung des Codes ergeben (z. B. den Unterschied zwischen einer for-Schleife und replicate ()). Das lässt dein Problem verschwinden.
quelle
In Bezug auf Ihre zwei Punkte:
replicate()
wie es funktioniert.elapsed
die dritte Zahl zu konzentrieren.Was ich oft mache ist
um einen gekürzten Mittelwert von 90% von N Wiederholungen des Anrufens zu erhalten
f()
.(Herausgegeben, danke an Hadley, der ein Denker ist.)
quelle
mean(replicate(N, system.time(f(...))[3]), trim = 0.05)
?Sie können auch Zeit mit Zeitschritten eingeben, die von zurückgegeben wurden
Sys.time
. Dies misst natürlich die Wandzeit, also die Rechenzeit in Echtzeit. Beispielcode:quelle
In Bezug auf die zu verwendende Timing-Metrik kann ich nicht zu den anderen Respondern hinzufügen.
In Bezug auf die zu verwendende Funktion verwende ich gerne den? Benchmark aus dem Paket rbenchmark .
quelle
Sie machen verschiedene Dinge. Zeit, was Sie getan haben möchten. replicate () gibt einen Ergebnisvektor für jede Ausführung der Funktion zurück. Die for-Schleife funktioniert nicht. Daher sind sie keine äquivalenten Aussagen.
Darüber hinaus gibt es eine Reihe von Möglichkeiten, wie Sie etwas tun möchten. Dann finden Sie die effizienteste Methode.
quelle