Ruby Academy · Oppitunti

Suorituskyvyn mittaaminen

Benchmark-moduuli.

Oppitunti 1/413 vaihetta

Suorituskyvyn mittaaminen on ilmainen Ruby Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/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 Ruby Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Ruby Academy-kurssilla on yhteensä 4 oppituntia.

Miksi mitata

Optimointi ilman mittaamista on arvailua. Rubyn vakiokirjaston Benchmark-moduuli mittaa koodin suoritusajan tarkasti.

  • Etsikää hitaat osat ennen niiden muuttamista
  • Vertailkaa toteutuksia objektiivisesti
  • Välttäkää ennenaikaista optimointia
require 'benchmark'

time = Benchmark.realtime do
  1_000_000.times { |i| i * 2 }
end
puts "Took #{time.round(4)}s"

Benchmark.measure

Benchmark.measure palauttaa raportin käyttäjäajasta, järjestelmäajasta ja todellisesta ajasta.

  • Käyttäjäaika on oman koodinne suorittamiseen käytetty suoritinaika
  • Todellinen aika on kellon mukaan kulunut aika
require 'benchmark'

result = Benchmark.measure do
  500_000.times { |i| i.to_s }
end
puts result

Benchmark.bm

Benchmark.bm suorittaa useita lohkoja ja merkitsee ne taulukkoon.

  • Antakaa otsakkeille leveys kohdistamista varten
  • Jokainen x.report muodostaa yhden rivin
require 'benchmark'

Benchmark.bm(10) do |x|
  x.report('to_s:') { 100_000.times { |i| i.to_s } }
  x.report('inspect:') { 100_000.times { |i| i.inspect } }
end

Benchmark.bmbm

Benchmark.bmbm suorittaa ensin harjoitusajon välimuistien ja GC:n lämmittämiseksi, mikä tuottaa vertailukelpoisempia tuloksia.

  • Ensimmäisen ajon tulokset hylätään
  • Toinen ajo on varsinainen mittaus
require 'benchmark'

Benchmark.bmbm do |x|
  x.report('sum:') { (1..100_000).sum }
  x.report('reduce:') { (1..100_000).reduce(:+) }
end

realtime nopeaan mittaukseen

Benchmark.realtime palauttaa liukulukuina vain kellon mukaan kuluneet sekunnit.

  • Yksinkertaisin tapa mitata yhden lohkon suoritusaika
  • Sopii hyvin yksittäisiin tarkistuksiin
require 'benchmark'

elapsed = Benchmark.realtime do
  arr = Array.new(100_000) { rand }
  arr.sort
end
puts "Sorted in #{elapsed.round(4)}s"

Monotoninen kello

Käyttäkää tarkkaan mittaukseen, johon järjestelmäkellon muutokset eivät vaikuta, Process.clock_gettime-menetelmää monotonisen kellon kanssa.

  • Ei reagoi NTP-korjauksiin
  • Tarkin sisäänrakennettu vaihtoehto
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
200_000.times { |i| i * i }
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
puts "Elapsed: #{(finish - start).round(4)}s"

Kahden lähestymistavan vertailu

Vertailutestit ovat parhaimmillaan, kun vertaillaan vaihtoehtoja. Suorittakaa molemmat samanlaisella kuormalla.

  • Pitäkää syötteen koko riittävän suurena, jotta erot ovat mitattavissa
  • Toistakaa mittaus kohinan vähentämiseksi
require 'benchmark'

arr = (1..100_000).to_a
Benchmark.bm(8) do |x|
  x.report('map:') { arr.map { |n| n * 2 } }
  x.report('each:') { r = []; arr.each { |n| r << n * 2 } }
end

Varokaa mikrovertailutestejä

Pienet vertailutestit voivat johtaa harhaan.

  • JIT ja välimuistit eivät välttämättä vastaa todellisia työkuormia
  • GC voi käynnistyä kesken mittauksen
  • Mitatkaa realistisen kokoisilla tietomäärillä
require 'benchmark'

# Too small to be meaningful
t = Benchmark.realtime { 10.times { |i| i + 1 } }
puts "Misleadingly tiny: #{t}s"

It iteraatiota sekunnissa

Usein haluatte mitata suorituskykyä: montako operaatiota sekunnissa suoritetaan. benchmark-ips-gem ilmoittaa tämän, mutta voitte arvioida arvon myös manuaalisesti.

  • Laskekaa iteraatiot kiinteän mittausjakson aikana
  • Suurempi ips-arvo tarkoittaa nopeampaa suoritusta
deadline = Process.clock_gettime(Process::CLOCK_MONOTONIC) + 0.2
count = 0
while Process.clock_gettime(Process::CLOCK_MONOTONIC) < deadline
  count += 1
  'hello'.upcase
end
puts "Iterations in 0.2s: #{count}"

GC:n hallinta

Garbage collector voi vääristää tuloksia. Voitte poistaa sen tilapäisesti käytöstä vakaampien lukujen saamiseksi.

  • Kutsukaa ensin GC.disable ja lopuksi GC.enable
  • Käyttäkää tätä varoen muistin kasvun välttämiseksi
require 'benchmark'

GC.disable
t = Benchmark.realtime { 100_000.times { |i| i.to_s } }
GC.enable
puts "Without GC: #{t.round(4)}s"

Useiden ajokertojen keskiarvo

Suorittakaa vertailutesti useita kertoja ja laskekaa keskiarvo vaihtelun tasoittamiseksi.

  • Hylätkää tarvittaessa hitain poikkeava tulos
  • Ilmoittakaa vakauden vuoksi mediaani
require 'benchmark'

times = 3.times.map do
  Benchmark.realtime { (1..50_000).map { |n| n * n } }
end
avg = times.sum / times.size
puts "Average: #{avg.round(4)}s"

Pikatarkistus

Testatkaa vertailutestejä koskeva osaamisenne.

Kertaus

Opitte mittaamaan suorituskykyä:

  • Benchmark-moduuli mittaa koodin suoritusajan tarkasti
  • realtime, measure, bm ja bmbm palvelevat eri tarpeita
  • Käyttäkää tarkkoihin mittauksiin monotonista kelloa
  • Välttäkää harhaanjohtavia mikrovertailutestejä ja huomioikaa GC
  • Suorittakaa useita ajokertoja ja laskekaa niiden keskiarvo kohinan vähentämiseksi

Seuraavaksi käytätte erillisiä profilointityökaluja.

Aloita maksutta

Opi Ruby 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
29
Oppitunnit
109

Usein kysytyt kysymykset

Onko oppitunti ”Suorituskyvyn mittaaminen” ilmainen?

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

Mitä opin oppitunnilla ”Suorituskyvyn mittaaminen”?

Benchmark-moduuli. Harjoittelet Ruby Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Ruby Academy-opiskelun?

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

Kuinka kauan ”Suorituskyvyn mittaaminen”-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ä Ruby Academy-oppitunnilla?

Kyllä. Jokainen Ruby 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. Suorituskyvyn mittaaminen
  2. Profilointityökalut
  3. Muistin optimointi
  4. Yleiset pullonkaulat
← Takaisin: Ruby Academy