Benchmarking mit microbenchmark
Vergleichen Sie mehrere Implementierungen mit microbenchmark() statistisch
Benchmarking mit microbenchmark ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 4 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 microbenchmark?
system.time() hat eine Auflösung von Millisekunden und ist für schnelle Operationen unzuverlässig. Das Paket microbenchmark führt Ausdrücke Hunderte Male aus, berücksichtigt Aufwärmphasen und liefert Statistiken mit Nanosekundenauflösung – damit ist es das geeignete Werkzeug zum Vergleich ähnlicher Implementierungen.
Grundlegende Verwendung von microbenchmark
Übergeben Sie benannte Ausdrücke an microbenchmark(). Der Name jedes Arguments wird zur Beschriftung in der Ausgabe. Das Argument times steuert, wie oft jeder Ausdruck ausgewertet wird.
# library(microbenchmark)
# x <- 1:10000
#
# microbenchmark(
# loop = {
# s <- 0
# for (v in x) s <- s + v
# },
# vectorized = sum(x),
# times = 200L
# )Das Argument times auswählen
Mehr Wiederholungen liefern stabilere Schätzungen, benötigen aber mehr Zeit. Allgemeine Richtlinien:
- Schnelle Ausdrücke (Mikrosekunden):
times = 1000Loder mehr - Mittlere Geschwindigkeit (Millisekunden):
times = 100L - Langsame Ausdrücke (Sekunden):
times = 10Loder weniger
Der Standardwert ist times = 100L; das ist ein guter Ausgangspunkt.
# library(microbenchmark)
# microbenchmark(
# fast_op = sqrt(2),
# times = 10000L # many reps for a nanosecond-scale operation
# )
# microbenchmark(
# slow_op = sort(rnorm(1e6)),
# times = 10L # fewer reps for second-scale operation
# )Das Argument unit angeben
Verwenden Sie das Argument unit, um die Ergebnisse in einer geeigneten Einheit anzuzeigen:
'ns'– Nanosekunden (für sehr schnelle Operationen)'us'– Mikrosekunden'ms'– Millisekunden's'– Sekunden'relative'– Verhältnis zum schnellsten Ausdruck
# library(microbenchmark)
# x <- runif(1000)
#
# microbenchmark(
# sapply_sqrt = sapply(x, sqrt),
# vectorized = sqrt(x),
# times = 500L,
# unit = 'us' # display in microseconds
# )Die zusammengefasste Ausgabe interpretieren
microbenchmark gibt eine Übersichtstabelle mit folgenden Spalten aus:
- min – schnellster einzelner Durchlauf
- lq / mean / median / uq – unteres Quartil, Mittelwert, Median, oberes Quartil
- max – langsamster einzelner Durchlauf
- neval – Anzahl der Auswertungen
Verwenden Sie den Median als primäre Vergleichsgröße – er ist unempfindlich gegenüber gelegentlichen GC-Pausen, die Maximum und Mittelwert erhöhen.
# Example summary output (unit: microseconds):
#
# expr min lq mean median uq max neval
# loop 1203.1 1245.3 1301.7 1262.4 1310.1 2100.8 100
# vectorized 2.1 2.3 2.9 2.4 2.6 18.3 100
#
# => vectorized is ~525x faster at median
cat('Always compare medians, not means, for microbenchmark results
')summary() für ein microbenchmark-Objekt
Der Aufruf von summary(mb) für ein gespeichertes microbenchmark-Ergebnis gibt einen Dataframe zurück, den Sie programmgesteuert untersuchen können. Außerdem können Sie die unit im Aufruf von summary ändern.
# library(microbenchmark)
# x <- rnorm(5000)
# mb <- microbenchmark(
# vapply_abs = vapply(x, abs, numeric(1)),
# base_abs = abs(x),
# times = 200L
# )
# s <- summary(mb, unit = 'ms')
# print(s[, c('expr', 'min', 'median', 'max')])autoplot() für den visuellen Vergleich
autoplot(mb) verwendet ggplot2, um ein Violin- oder Boxplot der Zeitverteilungen über die Ausdrücke hinweg zu erstellen. So lassen sich nicht nur Medianunterschiede, sondern auch Streuung und Überschneidungen zwischen den Alternativen leicht erkennen.
# library(microbenchmark)
# library(ggplot2)
#
# x <- 1:50000
# mb <- microbenchmark(
# loop = { s <- 0; for (v in x) s <- s + v },
# vapply = vapply(x, identity, numeric(1)),
# vec = sum(x),
# times = 100L
# )
# autoplot(mb) # opens ggplot2 violin chartSchleife, vapply und sapply vergleichen
Ein klassischer Benchmark: Eine Funktion elementweise mit einer for-Schleife, sapply() oder vapply() anwenden. vapply() ist schneller als sapply(), weil der Ergebnisvektor vorab allokiert wird. Beide sind langsamer als vollständig vektorisierter Code.
# library(microbenchmark)
# x <- runif(5000, 1, 100)
#
# mb <- microbenchmark(
# for_loop = {
# r <- numeric(length(x))
# for (i in seq_along(x)) r[i] <- log(x[i])
# },
# sapply_log = sapply(x, log),
# vapply_log = vapply(x, log, numeric(1)),
# vec_log = log(x),
# times = 200L, unit = 'us'
# )
# print(mb)Zuerst die Korrektheit prüfen
Überprüfen Sie vor dem Benchmarking, dass alle Ausdrücke identische Ergebnisse zurückgeben. Eine schnellere, aber fehlerhafte Implementierung ist nutzlos. Verwenden Sie identical() oder all.equal(), um die Ausgaben zu vergleichen.
# x <- runif(1000)
# r1 <- sapply(x, sqrt)
# r2 <- sqrt(x)
# r3 <- vapply(x, sqrt, numeric(1))
#
# stopifnot(isTRUE(all.equal(r1, r2)))
# stopifnot(isTRUE(all.equal(r1, r3)))
# cat('All three produce identical results -- safe to benchmark
')
cat('Always verify correctness before comparing speed
')Benchmarking mit dem Argument setup
Verwenden Sie das Argument setup, um Code einmal vor den gemessenen Ausdrücken auszuführen. So wird die Zeit zur Datenerstellung nicht in den Benchmark einbezogen, wenn nicht die Datenerstellung gemessen werden soll.
# library(microbenchmark)
#
# microbenchmark(
# sort_base = sort(x),
# sort_order = x[order(x)],
# setup = { x <- rnorm(10000) },
# times = 100L
# )
# Each iteration refreshes x via setup, then times sort_base and sort_orderBenchmarks in einer Analyse dokumentieren
Wenn Sie Benchmark-Ergebnisse teilen, geben Sie immer Folgendes an:
- die R-Version und die Plattform
- die Paketversionen
- den verwendeten Wert von
times - die Größe der getesteten Daten
Messzeiten sind zwischen verschiedenen Rechnern nicht übertragbar – geben Sie beim Vergleich von Implementierungen Verhältnisse statt absoluter Zahlen an.
cat('R version :', R.version$version.string, '
')
cat('Platform :', R.version$platform, '
')
cat('Logical cores:', parallel::detectCores(), '
')Schnelltest: microbenchmark-Metrik
Welche zusammenfassende Statistik aus der Ausgabe von microbenchmark ist für den Vergleich zweier Implementierungen am zuverlässigsten?
Rückblick: microbenchmark
microbenchmark ist das Standardwerkzeug für rigoroses Microbenchmarking in R:
- Übergeben Sie benannte Ausdrücke und legen Sie mit
timesdie Anzahl der Wiederholungen fest - Verwenden Sie
unit = 'us'oder'ms'für eine gut lesbare Ausgabe - Vergleichen Sie die Mediane – sie sind unempfindlich gegenüber GC-Ausreißern
- Verwenden Sie
autoplot(), um Zeitverteilungen zu visualisieren - Überprüfen Sie die Korrektheit mit
all.equal(), bevor Sie benchmarken
Häufig gestellte Fragen
Ist die Lektion „Benchmarking mit microbenchmark“ kostenlos?
Ja — der vollständige Text von „Benchmarking mit microbenchmark“ 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 „Benchmarking mit microbenchmark“?
Vergleichen Sie mehrere Implementierungen mit microbenchmark() statistisch 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 4 von 4.
Wie lange dauert die Lektion „Benchmarking mit microbenchmark“?
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