Elixirin suorituskyvyn mittaus ja profilointi
Tunnistakaa Elixir-koodinne suorituskyvyn pullonkaulat vertailumittaustyökaluilla ja profilointitekniikoilla.
Elixirin suorituskyvyn mittaus ja profilointi on ilmainen Elixir ja Phoenix: skaalautuva backend-kehitys-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Elixir ja Phoenix: skaalautuva backend-kehitys-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Elixir ja Phoenix: skaalautuva backend-kehitys-kurssilla on yhteensä 4 oppituntia.
Suorituskyky: nopeus ja tehokkuus
Ohjelmistokehityksessä suorituskyvyllä tarkoitetaan sitä, kuinka nopeasti ja tehokkaasti sovellus toimii. Se on ratkaisevan tärkeää hyvän käyttökokemuksen ja palvelimen resurssien hallinnan kannalta.
Hitaat sovellukset voivat turhauttaa käyttäjiä ja johtaa niiden hylkäämiseen. Taustajärjestelmissä heikko suorituskyky voi merkitä suurempia infrastruktuurikustannuksia tai kyvyttömyyttä käsitellä käyttäjien kuormaa.
- Responsiivisuus: Kuinka nopeasti järjestelmä vastaa käyttäjän syötteeseen.
- Suoritusteho: Kuinka monta operaatiota järjestelmä pystyy käsittelemään ajan kuluessa.
- Resurssien käyttö: Kuinka paljon suoritinaikaa, muistia tai verkkokapasiteettia järjestelmä kuluttaa.
Mitä benchmarkkaus on?
Benchmarkkaus tarkoittaa koodiosan tai järjestelmän suorituskyvyn mittaamista tietyissä olosuhteissa. Sen avulla saatte selville, kuinka nopeasti koodinne eri osat suoritetaan.
Benchmarkkausta käytetään usein saman logiikan eri toteutusten vertailemiseen. Esimerkiksi: millä tavalla luettelo käsitellään nopeimmin? Suorittamalla toteutukset useita kertoja ja laskemalla tulosten keskiarvo saatte luotettavaa tietoa.
Yksinkertainen manuaalinen ajanmittaus
Elixir tarjoaa perustyökaluja suoritusajan mittaamiseen. Voimme käyttää System.monotonic_time/0- ja System.convert_time_unit/3-funktioita karkean arvion saamiseksi.
Kokeillaan yksinkertaisen luettelo-operaation ajan mittaamista. Aika ilmoitetaan natiiveina yksikköinä ja muunnetaan sitten mikrosekunneiksi.
defmodule MyTimer do
def run_and_time(fun) do
start_time = System.monotonic_time(:nanosecond)
result = fun.()
end_time = System.monotonic_time(:nanosecond)
duration = System.convert_time_unit(end_time - start_time, :nanosecond, :microsecond)
IO.puts "Function returned: #{inspect(result)}"
IO.puts "Execution took: #{duration} µs"
end
def example_task do
1..1_000_000 |> Enum.map(fn x -> x * 2 end)
end
end
# To run this in an IEx session or script:
MyTimer.run_and_time(fn -> MyTimer.example_task() end)Tutustukaa Bencheeen: Elixirin benchmarkkaustyökalu
Manuaalinen ajanmittaus on hyödyllistä, mutta se ei ole riittävän luotettavaa vakavaan benchmarkkaukseen. Roskienkeruun, suorittimen kuormituksen ja lämmitysajan kaltaiset tekijät voivat vääristää tuloksia.
Benchee on suosittu Elixir-kirjasto, joka on suunniteltu tarkkaan ja luotettavaan benchmarkkaukseen. Se suorittaa koodin useita kertoja, laskee tilastot ja esittää selkeät tulokset.
- Käsittelee lämmitysjaksot.
- Suorittaa tilastollisen analyysin (keskiarvo, keskihajonta).
- Vertailee useita funktioita helposti.
Ensimmäinen Benchee-benchmark
Bencheen käyttöä varten lisäätte yleensä {:benchee, "~> 1.0", only: :dev}-riippuvuuden tiedostoon mix.exs ja suoritatte komennon mix deps.get.
Näin määrittelette yksinkertaisen benchmarkin. Tämä koodi olisi yleensä esimerkiksi tiedostossa bench/my_benchmark.exs, ja se suoritettaisiin komennolla mix bench.
defmodule MyBenchmarks do
use Benchee.Benchmark
def run do
Benchee.run %{
"list_sum" => fn -> Enum.sum(1..10_000) end
},
time: 1,
memory_time: 0.1, # Shorten for quick example
print: [fast_warning: false]
end
end
# To run this directly (after adding Benchee to mix.exs and running mix deps.get):
# MyBenchmarks.run()Toteutusten vertaileminen
Yksi Bencheen vahvuuksista on eri lähestymistapojen vertailu. Verrataan kahta tapaa lisätä alkio listaan: käyttämällä ++-operaattoria (yhdistäminen) tai ilmauksella [new_element | list] (lisätään alkuun ja käännetään lista tarvittaessa, jos järjestyksellä on merkitystä).
Kun alkio halutaan tehokkaasti listan loppuun, ++ on yleinen vaihtoehto, mutta alkuun lisääminen on usein nopeampaa. Benchee auttaa varmistamaan tämän.
defmodule ListAppendBenchmarks do
use Benchee.Benchmark
def run do
long_list = Enum.to_list(1..10_000)
new_element = 10_001
Benchee.run %{
"append_with_++" => fn -> long_list ++ [new_element] end,
"prepend_and_reverse" => fn -> [new_element | long_list] |> Enum.reverse() end
},
time: 1,
memory_time: 0.1
end
end
# ListAppendBenchmarks.run()Bencheen tulosten tulkitseminen
Kun Benchee suoritetaan, se tulostaa tilastotaulukon:
- ips (iterations per second): Kuinka monta kertaa funktio voidaan suorittaa sekunnissa. Suurempi arvo on parempi.
- average: Yhden iteraation keskimääräinen suoritusaika. Pienempi arvo on parempi.
- std dev (standard deviation): Kuinka paljon suoritusajat vaihtelevat. Pienempi keskihajonta tarkoittaa yhdenmukaisempia tuloksia.
- median: Kaikkien suoritusaikojen keskimmäinen arvo.
- memory usage: Kuinka paljon muistia operaatio käyttää.
Kun tarkastelet nopeutta, keskity arvoihin ips ja average. Yhdenmukaisuuden arvioinnissa tarkastele arvoa std dev.
Mitä profilointi on
Suorituskykymittaus kertoo, kuinka nopeasti koodisi toimii, mutta profilointi kertoo, mihin koodisi käyttää aikansa. Sen avulla voit paikantaa tietyt funktiot tai koodirivit, jotka muodostavat pullonkauloja.
Profilointityökalu seuraa yleensä seuraavia asioita:
- CPU-aika: Mitkä funktiot käyttävät eniten laskentatehoa.
- Muistin käyttö: Mitkä osat varaavat eniten muistia.
- Funktiokutsut: Kutsupino, joka näyttää, mikä kutsuu mitäkin.
Tämä on tärkeää optimoinnissa, koska haluat keskittää työsi hitaimpiin osiin.
Profiloinnin perusteet :eprof-työkalulla
Erlang-virtuaalikoneessa toimivalla Elixirillä on käytettävissään Erlangin tehokas sisäänrakennettu profilointityökalu :eprof. Sen avulla voit löytää koodisi CPU-kuormitushuiput.
:eprof-työkalua käytetään yleensä vuorovaikutteisesti IEx-istunnossa. Se mittaa profiloidun lohkon sisällä kutsuttujen funktioiden suoritusajan.
defmodule MyProfiledCode do
def slow_function(n) do
Enum.map(1..n, fn x -> :math.pow(x, 0.5) |> round end)
end
def entry_point do
slow_function(5_000)
end
end
# To profile in IEx:
# :eprof.start_profiling()
# MyProfiledCode.entry_point()
# :eprof.stop_profiling()
# :eprof.analyze():eprof-raporttien lukeminen
Kun olet suorittanut komennon :eprof.analyze(), saat raportin, joka näyttää seuraavat tiedot:
- Function calls: Kuinka monta kertaa kutakin funktiota kutsuttiin.
- Total time: Funktion ja sen kutsumien funktioiden käyttämä CPU-aika yhteensä.
- Self time: Aika, jonka funktio itse käyttää suorittamiseen, lukuun ottamatta muiden funktioiden kutsuihin kuluvaa aikaa.
Etsi funktioita, joiden ”self time” tai ”total time” on suuri, sillä ne voivat muodostaa pullonkauloja. Tämä kertoo, missä suurin osa työstä tehdään.
Suorituskykytyökalujen testi
Olet oppinut sekä suorituskyvyn mittaamisesta että profiloinnista. Testataan nyt, mitä olet oppinut!
Yhteenveto: optimoi koodisi
Onnittelut! Olet tutustunut tärkeisiin työkaluihin, joiden avulla voit ymmärtää ja parantaa Elixir-sovelluksesi suorituskykyä.
- Suorituskyvyn mittaaminen (Bencheellä) mittaa, kuinka nopeasti koodi suoritetaan, ja vertailee eri toteutuksia.
- Profilointi (
:eprof-työkalulla) selvittää, mihin koodisi käyttää eniten aikaa, ja paikantaa pullonkaulat.
Näiden tekniikoiden avulla voit kirjoittaa tehokkaampia, nopeampia ja paremmin skaalautuvia Elixir-sovelluksia. Harjoittele jatkuvasti, jotta suorituskyvyn analysoinnista tulee säännöllinen osa kehitystyötäsi!
Opi Elixir 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
- 12
- Oppitunnit
- 48
Usein kysytyt kysymykset
Onko oppitunti ”Elixirin suorituskyvyn mittaus ja profilointi” ilmainen?
Kyllä – oppitunnin ”Elixirin suorituskyvyn mittaus ja profilointi” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Elixir ja Phoenix: skaalautuva backend-kehitys-kurssin, päivitä CoddyKit PROhon. Elixir ja Phoenix: skaalautuva backend-kehitys-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Elixirin suorituskyvyn mittaus ja profilointi”?
Tunnistakaa Elixir-koodinne suorituskyvyn pullonkaulat vertailumittaustyökaluilla ja profilointitekniikoilla. Harjoittelet Elixir ja Phoenix: skaalautuva backend-kehitys-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Elixir ja Phoenix: skaalautuva backend-kehitys-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Elixir ja Phoenix: skaalautuva backend-kehitys-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Elixirin suorituskyvyn mittaus ja profilointi”-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ä Elixir ja Phoenix: skaalautuva backend-kehitys-oppitunnilla?
Kyllä. Jokainen Elixir ja Phoenix: skaalautuva backend-kehitys-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
- Elixirin suorituskyvyn mittaus ja profilointi
- Valvonta Telemetryllä ja metriikoilla
- Virheenkäsittely ja rakenteinen lokitus
- Hajautettu jäljitys OpenTelemetrylla