Lua Academy · Oppitunti

Vertailumallien kirjoittaminen

Kirjoittakaa luotettavia mikrovertailuja os.clock-funktiolla ja välttäkää yleiset sudenkuopat.

Oppitunti 4/413 vaihetta

Vertailumallien kirjoittaminen on ilmainen Lua 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 Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Miksi tehdä vertailuja?

Mikrovertailut mittaavat tietyn koodinpätkän suorituskykyä eristettynä. Niiden avulla voitte varmistaa, että optimointi todella parantaa nopeutta intuition varaan luottamatta.

Vertailun perusmalli

Suorittakaa koodi silmukassa, mitatkaa kulunut aika os.clock()-funktiolla ja jakakaa tulos iteraatioiden määrällä.

local N = 1e6
local t0 = os.clock()
for i = 1, N do
  -- code to benchmark
end
local elapsed = os.clock() - t0
print(("%.2f ns/op"):format(elapsed / N * 1e9))

Lämmitysajo

Suorittakaa lämmitysajo ennen ajan mittaamista, jotta LuaJIT ehtii kääntää jäljet. Ilman lämmitysajoa ensimmäinen mitattu suoritus sisältää JIT-käännöksen aiheuttaman ylimääräisen ajan.

for i = 1, 1000 do hotFunction(i) end  -- warm up
local t0 = os.clock()
for i = 1, N do hotFunction(i) end
local elapsed = os.clock() - t0

Kuolleen koodin eliminoinnin estäminen

JIT saattaa optimoida pois laskutoimitukset, joiden tuloksia ei käytetä. Kootkaa tulokset muuttujaan, jotta vertailu antaa luotettavan tuloksen.

local sum = 0
for i = 1, N do sum = sum + math.sin(i) end
print(sum)  -- prevent elimination

Kahden lähestymistavan vertailu

Vertailkaa vaihtoehtoisia toteutuksia samoissa olosuhteissa. Suorittakaa ne vuorotellen tai useita kertoja käyttöjärjestelmän ajoituksesta aiheutuvan kohinan minimoimiseksi.

local function approach1() -- ...
end
local function approach2() -- ...
end
local function bench(fn, n)
  local t = os.clock()
  for _ = 1, n do fn() end
  return os.clock() - t
end
print("A:", bench(approach1, 1e5))
print("B:", bench(approach2, 1e5))

Tilastollinen analyysi

Suorittakaa vertailu useita kertoja ja laskekaa minimi, maksimi ja mediaani. GC-tauoista tai käyttöjärjestelmän ajoituksesta johtuvat poikkeamat tulee hylätä.

Muistin käytön vertailu

Mitattakaa muistivaraus suoritusajan mittaamisen rinnalla.

collectgarbage("collect")
local mem0 = collectgarbage("count")
-- ... run operation ...
collectgarbage("collect")
local mem1 = collectgarbage("count")
print(("Memory delta: %.1f KB"):format(mem1 - mem0))

GC:n häiriöiden välttäminen

Pysäyttäkää GC ennen ajan mittaamista, jotta mittaatte pelkän laskenta-ajan. Käynnistäkää se uudelleen mittauksen jälkeen.

collectgarbage("stop")
local t0 = os.clock()
for i = 1, N do -- ... end
print(os.clock() - t0)
collectgarbage("restart")

Realistiset vertailut ja mikrovertailut

Mikrovertailuilla voidaan optimoida pieniä koodinpätkiä, mutta ne eivät välttämättä kuvaa todellista suorituskykyä. Varmistakaa parannukset aina koko sovelluksen profiloinnilla.

Vertailuohjelmien apufunktiot

Rakentakaa uudelleenkäytettävä benchmark(name, fn, iters)-apuohjelma, joka tulostaa yhtenäiset ja muotoillut tulokset kaikista vertailuista.

local function benchmark(name, fn, iters)
  iters = iters or 1e5
  for _ = 1, iters // 10 do fn() end  -- warm up
  local t = os.clock()
  for _ = 1, iters do fn() end
  local ns = (os.clock() - t) / iters * 1e9
  print(("%-30s %8.1f ns/op"):format(name, ns))
end

Vertailut CI:ssä

Suorittakaa vertailut CI:ssä suorituskyvyn taantumien havaitsemiseksi. Antakaa ilmoitus, jos vertailun tulos heikkenee määritettyä kynnysarvoa enemmän (esimerkiksi 10 %).

Vertailukysymys

Miksi lämmitysajo on tärkeä LuaJIT-koodia vertailtaessa?

Kertaus: vertailumallit

Käyttäkää lämmitysajoa, estäkää kuolleen koodin eliminointi käyttämällä tuloksia, mitatkaa os.clock()-funktiolla, hallitkaa GC:tä ja suorittakaa useita mittauksia vakaiden tulosten saamiseksi. Rakentakaa uudelleenkäytettävä vertailuapuohjelma yhdenmukaisuuden varmistamiseksi.

Aloita maksutta

Opi Lua 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
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Vertailumallien kirjoittaminen” ilmainen?

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

Mitä opin oppitunnilla ”Vertailumallien kirjoittaminen”?

Kirjoittakaa luotettavia mikrovertailuja os.clock-funktiolla ja välttäkää yleiset sudenkuopat. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua 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 ”Vertailumallien kirjoittaminen”-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ä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua 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. LuaJIT-arkkitehtuurin yleiskatsaus
  2. JIT-ystävällisen Luan kirjoittaminen
  3. Profilointi työkaluilla jit.p ja perf
  4. Vertailumallien kirjoittaminen
← Takaisin: Lua Academy