C++ Academy · Oppitunti

Profilointi perfillä, vtunella ja Sanitizereilla

Profiloi ohjelmia perfillä ja Intel VTunella ja löydä virheitä AddressSanitizerilla.

Oppitunti 3/415 vaihetta

Profilointi perfillä, vtunella ja Sanitizereilla on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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 C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Miksi profiloida

Suorituskykyä koskeva intuitio on yleensä väärässä. Profiloikaa todellisten pullonkaulojen löytämiseksi ja optimoikaa vasta sitten.

Linux: perf

perf on Linuxin mukana toimitettava, vähän yleiskustannuksia aiheuttava otantaan perustuva profiloija. Suorittakaa se millä tahansa debug-tiedoilla rakennetulla binäärillä.

g++ -O2 -g main.cpp -o main
perf record ./main
perf report

perf stat

Tulostaa suorituksesta yhteenvetomittarit: kellojaksot, käskyt, välimuistihäiriöt ja haarojen väärät ennustukset.

perf stat -e cycles,instructions,cache-misses,branch-misses ./main

Liekkikaaviot

Muuntaa perf-tiedot liekkikaavioksi, joka näyttää, mihin aika kuluu.

perf record -F 99 -g ./main
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg

macOS: Instruments

Applen Instruments tarjoaa suoritusajan profilointia, varausten ja muistivuotojen tarkastelua sekä paljon muuta. Se on ilmainen Xcoden mukana.

Windows: VTune Profiler

Intel VTune (ilmainen henkilökohtaiseen käyttöön) tarjoaa yksityiskohtaisen mikroarkkitehtuurianalyysin: suoritusputken pysähdykset, välimuistihäiriöt ja kuumat lohkot. Se toimii useilla alustoilla.

Sanitizerit löytävät virheitä

Sanitizerit ovat clangiin ja gcc:hen sisäänrakennettuja ajonaikaisia tarkistimia. Kääntäkää ohjelma uudelleen sopivalla valitsimella:

  • -fsanitize=address — AddressSanitizer muistivirheille
  • -fsanitize=thread — ThreadSanitizer datakilpailuille
  • -fsanitize=undefined — UB Sanitizer allekirjoitettujen kokonaislukujen ylivuodoille ja muulle määrittelemättömälle toiminnalle
  • -fsanitize=memory — MSan alustamattomien tietojen lukemiseen

AddressSanitizer-esimerkki

Havaitsee puskurin ylivuodot, vapautetun muistin käytön ja muistin kaksoisvapautuksen pinojälkien avulla.

g++ -fsanitize=address -g main.cpp
./a.out
# Output points exactly at the bug

Käännösaika ja ajonaika

Staattinen analyysi (clang-tidy, cppcheck) löytää virheitä ilman ohjelman ajamista. Sanitizerit löytävät ajonaikaisia virheitä. Käyttäkää molempia, sillä ne löytävät erilaisia ongelmia.

Varausten profilointi

Kekomuistivaraukset ovat hitaita. Käyttäkää työkaluja perf, Valgrindin massifia tai Heaptrackia kuumien varauskohtien löytämiseen ja vähentämiseen.

Profiilien lukeminen

Keskittykää profiilin tärkeimpiin funktioihin. Tarkastelkaa sitten kutsupuuta ymmärtääksenne asiayhteyden. Muutaman prosentin erot eivät yleensä ole optimoinnin arvoisia.

Jatkuva profilointi

Tuotantokäytössä Pyroscope- tai Pixie-työkalujen kaltaiset otantaan perustuvat profiloijat keräävät tietoja jatkuvasti vähäisin yleiskustannuksin. Näin regressiot voidaan havaita ennen kuin ne haittaavat käyttäjiä.

Työnkulku

Optimointisilmukka:

  1. Mitatkaa pullonkaulan tunnistamiseksi
  2. Muodostakaa hypoteesi
  3. Muuttakaa yhtä asiaa
  4. Mitatkaa uudelleen

Ilman mittausta arvaatte.

Pikatarkistus

Mikä kääntäjän valitsin ottaa AddressSanitizerin käyttöön?

Kertaus

Profiloikaa työkaluilla perf (Linux), Instruments (macOS) tai VTune (useilla alustoilla) pullonkaulojen löytämiseksi. Käyttäkää sanitizereita muisti- ja säievirheiden havaitsemiseen ajoissa. Mitatkaa, muodostakaa hypoteesi, muuttakaa yhtä asiaa ja mitatkaa uudelleen.

Aloita maksutta

Opi C++ 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
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Profilointi perfillä, vtunella ja Sanitizereilla” ilmainen?

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

Mitä opin oppitunnilla ”Profilointi perfillä, vtunella ja Sanitizereilla”?

Profiloi ohjelmia perfillä ja Intel VTunella ja löydä virheitä AddressSanitizerilla. Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

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

Kuinka kauan ”Profilointi perfillä, vtunella ja Sanitizereilla”-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ä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ 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. Välimuistiystävälliset tietorakenteet
  2. Haarautumisen ennustaminen ja kuumat silmukat
  3. Profilointi perfillä, vtunella ja Sanitizereilla
  4. Mikrovertailut Google Benchmarkilla
← Takaisin: C++ Academy