2012-04-06 13 views
2

Ich habe einen Code, den ich von Matlab nach R portiert habe. Ich möchte ihre Leistung vergleichen.R-Code-Ausführung mit: Systemzeit()

Allerdings habe ich ein Problem festgestellt: Verwenden system.time() in R, aber ich bekomme unterschiedliche Ergebnisse für den gleichen Code. Soll das passieren? Wie vergleiche ich es?

+2

Nicht direkt auf Ihre Frage bezogen, aber denken Sie immer daran, dass Sie nicht nur R vs Matlab vergleichen, Sie vergleichen auch Ihre Fähigkeit, Code zu schreiben, der den größten Vorteil beider Sprachen nutzt. – joran

+0

Danke joran! Bin dankbar! –

Antwort

6

Sie erhalten andere Ergebnisse, wenn Sie sich selbst einen 100m-Sprint absolvieren! Auf dem Computer gibt es viele Dinge, die die Zeit für die Ausführung Ihres Codes ein wenig variieren.

Die Lösung besteht darin, den Code mehrmals auszuführen. Das R-Paket benchmark ist, was Sie suchen.

+0

Danke! ;) Ich dachte, es könnte diese Situation sein, aber in meinem Netzwerk kennt niemand R, also können sie die Zahlen nicht erklären! –

0

Wie @Justin sagte, die Zeiten werden immer variieren. Vor allem beim ersten Mal ein paar Mal, da sich das Garbage-Collection-System nicht auf Ihren spezifischen Einsatz eingestellt hat. Es kann eine gute Idee sein, R vor dem Messen neu zu starten (und andere Programme zu schließen, stellen Sie sicher, dass das System zu diesem Zeitpunkt nicht nach Viren scannt usw.) ...

Beachten Sie, dass wenn die gemessene Zeit klein ist (Bruchteile von a Zweitens, der relative Fehler wird ziemlich groß sein, versuchen Sie also, das Problem so einzustellen, dass es mindestens eine Sekunde dauert.

Die Pakete benchmark oder rbenchmark können helfen.

... aber ich mache normalerweise nur eine For-Schleife um das Problem herum und passe es an, bis es eine Sekunde dauert - und dann laufe ich es auch mehrmals.

Hier ist ein Beispiel:

f <- function(x, y) { 
    sum <- 1 
    for (i in seq_along(x)) sum <- x[[i]] + y[[i]] * sum 
    sum 
} 

n <- 10000 
x <- 1:n + 0.5 
y <- -1:-n + 0.5 
system.time(f(x,y)) # 0.02-0.03 secs 

system.time(for(i in 1:100) f(x,y)) # 1.56-1.59 secs 

... so nennt es die 100-fachte die relativen Fehler viel reduziert.

+0

Die verwendete Zeit sind die Zähler des Betriebssystems für Prozesszeiten. Dies sind Stichprobenwerte und sind normalerweise ziemlich genau. Aber sie können sehr falsche Ergebnisse liefern, wenn es einen konkurrierenden Prozess gibt, der von einem Timer mit der "falschen" Frequenz gesteuert wird (abhängig vom Betriebssystem, für OpenVms AXP sind es Vielfache von 10ms). –

+0

Danke! Es hilft mir zu verstehen! –