R Academy · leksjon

Ytelsesmåling med microbenchmark

Sammenlign flere implementasjoner statistisk med microbenchmark().

Leksjon 4 av 413 trinn

Ytelsesmåling med microbenchmark er en gratis leksjon i R Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i R Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i R Academy inneholder totalt 4 leksjoner.

Hvorfor microbenchmark?

system.time() har oppløsning på millisekunder og er upålitelig for raske operasjoner. Pakken microbenchmark kjører uttrykk hundrevis av ganger, håndterer oppvarming og rapporterer statistikk med oppløsning på nanosekunder — noe som gjør den til riktig verktøy for å sammenligne lignende implementasjoner.

Grunnleggende bruk av microbenchmark

Send navngitte uttrykk til microbenchmark(). Navnet på hvert argument blir etiketten i resultatet. Argumentet times bestemmer hvor mange ganger hvert uttrykk evalueres.

# library(microbenchmark)
# x <- 1:10000
#
# microbenchmark(
#   loop = {
#     s <- 0
#     for (v in x) s <- s + v
#   },
#   vectorized = sum(x),
#   times = 200L
# )

Valg av argumentet times

Flere repetisjoner gir mer stabile estimater, men tar lengre tid. Generelle retningslinjer:

  • Raske uttrykk (mikrosekunder): times = 1000L eller mer
  • Middels raske (millisekunder): times = 100L
  • Tregere (sekunder): times = 10L eller færre

Standardverdien er times = 100L, som er et godt utgangspunkt.

# 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
# )

Angivelse av argumentet unit

Bruk argumentet unit for å vise resultater i en praktisk skala:

  • 'ns' — nanosekunder (for svært raske operasjoner)
  • 'us' — mikrosekunder
  • 'ms' — millisekunder
  • 's' — sekunder
  • 'relative' — forholdet til det raskeste uttrykket
# library(microbenchmark)
# x <- runif(1000)
#
# microbenchmark(
#   sapply_sqrt = sapply(x, sqrt),
#   vectorized  = sqrt(x),
#   times = 500L,
#   unit = 'us'   # display in microseconds
# )

Tolkning av sammendragsresultatet

microbenchmark skriver ut en sammendragstabell med disse kolonnene:

  • min — raskeste enkeltkjøring
  • lq / mean / median / uq — nedre kvartil, gjennomsnitt, median, øvre kvartil
  • max — tregeste enkeltkjøring
  • neval — antall evalueringer

Bruk median som det primære sammenligningsmålet — den påvirkes lite av sporadiske GC-pauser som gjør max og mean større.

# 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() på et microbenchmark-objekt

Hvis De kaller summary(mb) på et lagret microbenchmark-resultat, returneres en data frame som De kan undersøke programmatisk. De kan også endre unit i kallet til summary.

# 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() for visuell sammenligning

autoplot(mb) bruker ggplot2 til å tegne et fiolinplott eller boksplott av tidsfordelingene for de ulike uttrykkene. Dette gjør det enkelt å se ikke bare forskjeller i median, men også variasjon og overlapp mellom alternativene.

# 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

Sammenligning av løkke, vapply og sapply

En klassisk referansemåling er å bruke en funksjon elementvis med en for-løkke, sapply() eller vapply(). vapply() er raskere enn sapply() fordi den forhåndsallokerer resultatvektoren. Begge er tregere enn fullt vektorisert kode.

# 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)

Kontroller korrektheten først

Før De gjør referansemålinger, må De kontrollere at alle uttrykkene returnerer identiske resultater. En rask, men feilaktig implementasjon er ubrukelig. Bruk identical() eller all.equal() for å sammenligne resultater.

# 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
')

Referansemåling med argumentet setup

Bruk argumentet setup til å kjøre kode én gang før uttrykkene som måles. Da unngår De å ta med tiden det tar å opprette dataene i referansemålingen når det ikke er dataopprettingen De ønsker å måle.

# 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

Rapportering av referansemålinger i analyser

Når De deler resultater fra referansemålinger, må De alltid oppgi:

  • R-versjonen og plattformen
  • Pakkeversjoner
  • Verdien som ble brukt for times
  • Størrelsen på dataene som ble målt

Målinger kan ikke uten videre overføres mellom maskiner — oppgi forholdstall, ikke absolutte tall, når De sammenligner implementasjoner.

cat('R version    :', R.version$version.string, '
')
cat('Platform     :', R.version$platform, '
')
cat('Logical cores:', parallel::detectCores(), '
')

Hurtigsjekk: microbenchmark-metrikk

Hvilken sammendragsstatistikk fra resultatet av microbenchmark er mest pålitelig når De sammenligner to implementasjoner?

Repetisjon av microbenchmark

microbenchmark er standardverktøyet for grundig mikromåling i R:

  • Send navngitte uttrykk og angi times for å styre antallet repetisjoner
  • Bruk unit = 'us' eller 'ms' for et lettlest resultat
  • Sammenlign medianer — de påvirkes lite av GC-uteliggere
  • Bruk autoplot() til å visualisere tidsfordelinger
  • Kontroller korrektheten med all.equal() før De gjør referansemålinger
Gratis å komme i gang

Lær deg R med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
43
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Ytelsesmåling med microbenchmark» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien R Academy, inkludert «Ytelsesmåling med microbenchmark», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i R Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Ytelsesmåling med microbenchmark»?

Sammenlign flere implementasjoner statistisk med microbenchmark(). Du øver på R Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med R Academy?

Ingen tidligere erfaring er nødvendig. R Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Ytelsesmåling med microbenchmark»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne R Academy-leksjonen?

Ja. Alle R Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. system.time() og proc.time()
  2. Profilere kode med Rprof og profvis
  3. Vektorisering for høyere ytelse
  4. Ytelsesmåling med microbenchmark
← Tilbake til R Academy