system.time() und proc.time()
Messen Sie die verstrichene Zeit sowie Benutzer- und Systemzeit für R-Ausdrücke
system.time() und proc.time() ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum sollte man die Performance messen?
Bevor Sie Code optimieren, müssen Sie ihn messen. Wenn Sie raten, wo die Langsamkeit auftritt, verschwenden Sie Zeit und Mühe. R stellt integrierte Werkzeuge bereit, mit denen Sie Ausdrücke präzise messen können.
Die drei wichtigsten Werkzeuge sind system.time(), proc.time() und Sys.time(). Jedes dient einem anderen Zweck bei der Performanceanalyse.
Grundlagen von system.time()
system.time(expr) wertet einen Ausdruck aus und gibt zurück, wie lange dies gedauert hat. Dies ist die einfachste Möglichkeit, eine einzelne Operation in R zu messen.
Das Ergebnis ist ein Objekt der Klasse proc_time mit benannten Elementen, die Sie untersuchen können.
result <- system.time({
x <- 1:1000000
total <- sum(x)
})
print(result)Die drei Zeitwerte verstehen
system.time() gibt fünf Werte zurück, aber drei davon sind besonders wichtig:
- user – CPU-Zeit, die vom R-Code selbst verwendet wurde
- sys – CPU-Zeit, die das Betriebssystem im Auftrag von R verwendet hat
- elapsed – verstrichene Zeit (die tatsächlich vergangenen Sekunden)
Meistens ist der Wert für „elapsed“ entscheidend. „user“ + „sys“ kann auf Mehrkernsystemen größer als „elapsed“ sein.
t <- system.time(Sys.sleep(0.1))
cat('user :', t['user.self'], '
')
cat('sys :', t['sys.self'], '
')
cat('elapsed:', t['elapsed'], '
')proc.time() für die manuelle Zeitmessung
proc.time() gibt die aktuellen CPU- und verstrichenen Zeiten als Momentaufnahme zurück. Indem Sie diese vor und nach einem Codeblock erfassen, können Sie einen beliebigen Codeabschnitt messen.
Subtrahieren Sie die Startmomentaufnahme von der Endmomentaufnahme, um die für diesen Abschnitt verstrichene Zeit zu erhalten.
start <- proc.time()
for (i in 1:100000) sqrt(i)
end <- proc.time()
diff <- end - start
cat('elapsed:', diff['elapsed'], 'seconds
')Bestandteile von proc.time()
proc.time() gibt einen benannten numerischen Vektor mit drei Elementen zurück:
user.self– Benutzer-CPU-Zeit des R-Prozessessys.self– System-CPU-Zeit des R-Prozesseselapsed– verstrichene Zeit seit dem Start von R
Die Differenz zwischen zwei Aufrufen von proc.time() liefert aussagekräftige Zeitdifferenzen.
pt <- proc.time()
cat('Names:', names(pt), '
')
cat('Values:', pt, '
')
cat('Class:', class(pt), '
')Sys.time() für Zeitstempel der Echtzeit
Sys.time() gibt das aktuelle Datum und die aktuelle Uhrzeit als Objekt vom Typ POSIXct zurück. Anders als proc.time() liefert die Funktion einen Zeitstempel aus der realen Welt und nicht nur Angaben zur CPU-Nutzung.
Das ist nützlich, wenn Sie protokollieren möchten, wann etwas passiert ist, und nicht nur, wie lange es gedauert hat.
start_time <- Sys.time()
cat('Start:', format(start_time), '
')
Sys.sleep(0.05)
end_time <- Sys.time()
cat('End :', format(end_time), '
')difftime() zum Messen von Zeitintervallen
difftime(end, start, units='secs') berechnet die Differenz zwischen zwei POSIXct-Zeitstempeln. Sie können die Einheit auswählen: 'secs', 'mins', 'hours', 'days'.
Diese Funktion lässt sich gut mit Sys.time() für eine verständliche Ausgabe von Zeitmessungen kombinieren.
t1 <- Sys.time()
x <- cumsum(1:500000)
t2 <- Sys.time()
delta <- difftime(t2, t1, units = 'secs')
cat('Time taken:', round(as.numeric(delta), 4), 'seconds
')Zeitmessung in einer Schleife mit replicate()
Eine einzelne Zeitmessung kann aufgrund der Garbage Collection oder der Prozessplanung des Betriebssystems schwanken. replicate(n, system.time(expr)['elapsed']) führt den Ausdruck mehrfach aus und gibt einen Vektor mit den verstrichenen Zeiten zurück.
Der Median der wiederholten Messungen liefert eine stabilere Schätzung.
times <- replicate(10, system.time({
x <- rnorm(10000)
mean(x)
})['elapsed'])
cat('Median elapsed:', median(times), 'seconds
')
cat('Range:', range(times), '
')Zwei Ansätze vergleichen
Verwenden Sie system.time(), um zwei Implementierungen derselben Aufgabe direkt zu vergleichen. Mit diesem Muster können Sie bestätigen, dass ein Ansatz schneller ist, bevor Sie sich für ihn entscheiden.
n <- 100000
t_loop <- system.time({
result <- numeric(n)
for (i in seq_len(n)) result[i] <- i^2
})['elapsed']
t_vec <- system.time({
result <- seq_len(n)^2
})['elapsed']
cat('Loop :', t_loop, 's
')
cat('Vector :', t_vec, 's
')
cat('Speedup:', round(t_loop / max(t_vec, 1e-6), 1), 'x
')Verschachtelte Operationen messen
Sie können Aufrufe von system.time() verschachteln oder innerhalb eines Workflows mit proc.time() Zwischenstände erfassen, um den Engpass zu ermitteln.
Geben Sie während der Ausführung des Skripts Zwischendifferenzen aus, um eine zeitliche Abfolge Ihrer Pipeline zu erstellen.
p0 <- proc.time()
x <- rnorm(200000)
p1 <- proc.time()
y <- sort(x)
p2 <- proc.time()
z <- cumsum(y)
p3 <- proc.time()
cat('Generate:', (p1-p0)['elapsed'], 's
')
cat('Sort :', (p2-p1)['elapsed'], 's
')
cat('Cumsum :', (p3-p2)['elapsed'], 's
')Praktische Tipps zur Zeitmessung
Beachten Sie beim Messen von R-Code die folgenden Vorgehensweisen:
- Führen Sie den Code vor der Messung einmal aus, um JIT und Dateicaches aufzuwärmen
- Verwenden Sie vor der Messung
gc(), um den Zustand der Garbage Collection zurückzusetzen - Bevorzugen Sie bei Wiederholungen den Median gegenüber dem Mittelwert – Ausreißer durch die Garbage Collection verzerren den Mittelwert
- Messen Sie den Engpass und nicht das gesamte Skript
gc() # clear garbage before timing
times <- replicate(5, system.time({
m <- matrix(rnorm(1000 * 1000), nrow = 1000)
crossprod(m)
})['elapsed'])
cat('Median:', median(times), 's
')Kurze Überprüfung: Bestandteile von system.time()
Welche Komponente von system.time() entspricht den tatsächlich während der Ausführung vergangenen Sekunden in Echtzeit?
Zusammenfassung der Performance-Zeitmessung
Sie verfügen nun über drei sich ergänzende Werkzeuge zur Zeitmessung in Base R:
system.time(expr)– schnellste Möglichkeit, einen Ausdruck zu messen; gibt „user“, „sys“ und „elapsed“ zurückproc.time()– Zeitmessung auf Grundlage von Momentaufnahmen für beliebige CodeblöckeSys.time()+difftime()– Zeitstempel der Echtzeit und verständliche Zeitintervalle
Verwenden Sie replicate(), um stabile Medianwerte der Zeitmessungen zu erhalten, bevor Sie Schlussfolgerungen zur Performance ziehen.
Häufig gestellte Fragen
Ist die Lektion „system.time() und proc.time()“ kostenlos?
Ja — der vollständige Text von „system.time() und proc.time()“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „system.time() und proc.time()“?
Messen Sie die verstrichene Zeit sowie Benutzer- und Systemzeit für R-Ausdrücke Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um R Academy zu starten?
Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „system.time() und proc.time()“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?
Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- system.time() und proc.time()
- Code mit Rprof und profvis profilieren
- Vektorisierung für mehr Geschwindigkeit
- Benchmarking mit microbenchmark