Ytelsesmåling med microbenchmark
Sammenlign flere implementasjoner statistisk med microbenchmark().
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 = 1000Leller mer - Middels raske (millisekunder):
times = 100L - Tregere (sekunder):
times = 10Leller 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 chartSammenligning 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_orderRapportering 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
timesfor å 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
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
- system.time() og proc.time()
- Profilere kode med Rprof og profvis
- Vektorisering for høyere ytelse
- Ytelsesmåling med microbenchmark