0Pricing
R Academy · Lektion

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 = 1000L oder mehr
  • Mittlere Geschwindigkeit (Millisekunden): times = 100L
  • Langsame Ausdrücke (Sekunden): times = 10L oder 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 chart

Schleife, 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_order

Benchmarks 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 times die 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

  1. system.time() und proc.time()
  2. Code mit Rprof und profvis profilieren
  3. Vektorisierung für mehr Geschwindigkeit
  4. Benchmarking mit microbenchmark
← Zurück zu R Academy