Vertailumallien kirjoittaminen
Kirjoittakaa luotettavia mikrovertailuja os.clock-funktiolla ja välttäkää yleiset sudenkuopat.
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() - t0Kuolleen 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 eliminationKahden 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))
endVertailut 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.
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
- LuaJIT-arkkitehtuurin yleiskatsaus
- JIT-ystävällisen Luan kirjoittaminen
- Profilointi työkaluilla jit.p ja perf
- Vertailumallien kirjoittaminen