Suorituskyvyn vertailu microbenchmarkilla
Vertailkaa useita toteutuksia tilastollisesti microbenchmark()-funktion avulla.
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 = 1000Ltai enemmän - Kohtalaisen nopeat (millisekunteja):
times = 100L - Hitaat (sekunteja):
times = 10Ltai 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 chartSilmukan, 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_orderVertailumittausten 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
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
- system.time() ja proc.time()
- Koodin profilointi Rprof- ja profvis-työkaluilla
- Vektorointi suorituskyvyn parantamiseksi
- Suorituskyvyn vertailu microbenchmarkilla