R Academy · Oppitunti

Suorituskyvyn vertailu microbenchmarkilla

Vertailkaa useita toteutuksia tilastollisesti microbenchmark()-funktion avulla.

Oppitunti 4/413 vaihetta

Suorituskyvyn vertailu microbenchmarkilla on ilmainen R Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu R Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. R Academy-kurssilla on yhteensä 4 oppituntia.

Miksi microbenchmarkia käytetään?

system.time()-funktion tarkkuus on millisekunteja, joten se on epäluotettava nopeiden operaatioiden mittaamiseen. microbenchmark-paketti suorittaa lausekkeet satoja kertoja, huomioi lämmitysvaiheen ja raportoi nanosekuntitarkkuuden tilastot — siksi se on oikea työkalu samankaltaisten toteutusten vertailuun.

microbenchmarkin peruskäyttö

Välittäkää nimetyt lausekkeet funktiolle microbenchmark(). Kunkin argumentin nimestä tulee tulosteen otsake. times-argumentti määrittää, kuinka monta kertaa kukin lauseke arvioidaan.

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

times-argumentin valitseminen

Useammat toistot tuottavat vakaampia arvioita, mutta vievät enemmän aikaa. Yleiset ohjeet:

  • Nopeat lausekkeet (mikrosekunteja): times = 1000L tai enemmän
  • Kohtalaisen nopeat (millisekunteja): times = 100L
  • Hitaat (sekunteja): times = 10L tai vähemmän

Oletusarvo on times = 100L, joka on hyvä lähtökohta.

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

unit-argumentin määrittäminen

Käyttäkää unit-argumenttia tulosten näyttämiseen sopivassa mittakaavassa:

  • 'ns' — nanosekuntia (erittäin nopeille operaatioille)
  • 'us' — mikrosekuntia
  • 'ms' — millisekunteja
  • 's' — sekunteja
  • 'relative' — suhde nopeimpaan lausekkeeseen
# library(microbenchmark)
# x <- runif(1000)
#
# microbenchmark(
#   sapply_sqrt = sapply(x, sqrt),
#   vectorized  = sqrt(x),
#   times = 500L,
#   unit = 'us'   # display in microseconds
# )

Yhteenvetotulosteen tulkitseminen

microbenchmark tulostaa yhteenvetotaulukon, jossa on seuraavat sarakkeet:

  • min — yksittäisen suorituksen nopein aika
  • lq / mean / median / uq — alakvartiili, keskiarvo, mediaani, yläkvartiili
  • max — yksittäisen suorituksen hitain aika
  • neval — arviointien määrä

Käyttäkää ensisijaisena vertailumittarina mediaania — se ei ole yhtä herkkä satunnaisille GC-tauoille, jotka kasvattavat maksimiarvoa ja keskiarvoa.

# 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() microbenchmark-oliolle

Tallennetulle microbenchmark-tulokselle kutsuttu summary(mb) palauttaa data framen, jota voitte tarkastella ohjelmallisesti. Voitte myös vaihtaa unit-arvon yhteenvetokutsussa.

# 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() visuaaliseen vertailuun

autoplot(mb) käyttää ggplot2-pakettia piirtämään viulu- tai laatikkokuvion eri lausekkeiden ajoitusjakaumista. Näin näette helposti mediaanien erojen lisäksi myös vaihtelun ja vaihtoehtojen päällekkäisyyden.

# 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

Silmukan, vapply-funktion ja sapply-funktion vertailu

Klassinen vertailukohta on funktion käyttäminen alkioittain for-silmukalla, sapply()-funktiolla tai vapply()-funktiolla. vapply() on nopeampi kuin sapply(), koska se varaa tulosvektorille tilan etukäteen. Molemmat ovat hitaampia kuin täysin vektorisoitu koodi.

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

Oikeellisuuden tarkistaminen ensin

Varmistakaa ennen vertailumittausta, että kaikki lausekkeet palauttavat identtiset tulokset. Nopeasta mutta virheellisestä toteutuksesta ei ole hyötyä. Käyttäkää tulosten vertailuun funktiota identical() tai all.equal().

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

Vertailumittaus setup-argumentilla

Käyttäkää setup-argumenttia suorittamaan koodi kerran ennen ajastettavia lausekkeita. Näin vältätte aineiston luontiin kuluvan ajan sisällyttämisen vertailumittaukseen, kun aineiston luonti ei ole mittauksen kohteena.

# 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

Vertailumittausten raportointi analyysissä

Kun jaatte vertailumittausten tuloksia, ilmoittakaa aina:

  • R:n versio ja alusta
  • Pakettien versiot
  • Käytetty times-arvo
  • Mitattu aineiston koko

Ajoitusajat eivät ole siirrettävissä koneesta toiseen — ilmoittakaa toteutuksia vertaillessanne absoluuttisten lukujen sijaan suhdeluvut.

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

Pikatarkistus: microbenchmarkin mittari

Mikä microbenchmark-tulosteen yhteenvetotilasto on luotettavin kahden toteutuksen vertailuun?

microbenchmarkin kertaus

microbenchmark on R:n vakiotyökalu tarkkoihin mikrovertailumittauksiin:

  • Välittäkää nimetyt lausekkeet ja määrittäkää toistojen määrä times-argumentilla
  • Käyttäkää luettavassa tulosteessa unit = 'us' tai 'ms'
  • Vertailkaa mediaaneja — ne kestävät GC-poikkeamat
  • Visualisoikaa ajoitusjakaumat funktiolla autoplot()
  • Varmistakaa oikeellisuus funktiolla all.equal() ennen vertailumittausta
Aloita maksutta

Opi R tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
43
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Suorituskyvyn vertailu microbenchmarkilla” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa R Academy-oppimispolun 3 oppituntia, myös oppitunnin “Suorituskyvyn vertailu microbenchmarkilla”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. R Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Suorituskyvyn vertailu microbenchmarkilla”?

Vertailkaa useita toteutuksia tilastollisesti microbenchmark()-funktion avulla. Harjoittelet R Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni R Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin R Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Suorituskyvyn vertailu microbenchmarkilla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä R Academy-oppitunnilla?

Kyllä. Jokainen R Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. system.time() ja proc.time()
  2. Koodin profilointi Rprof- ja profvis-työkaluilla
  3. Vektorointi suorituskyvyn parantamiseksi
  4. Suorituskyvyn vertailu microbenchmarkilla
← Takaisin: R Academy