Profilování (počítačové programování) - Profiling (computer programming)

V softwarovém inženýrství je profilování („profilování programu“, „softwarové profilování“) formou dynamické analýzy programu, která měří například prostorovou (paměťovou) nebo časovou složitost programu , využití konkrétních instrukcí nebo frekvenci a doba trvání volání funkce. Nejčastěji profilovací informace slouží k podpoře optimalizace programu a konkrétněji výkonového inženýrství .

Profilování je dosaženo instrumentováním buď zdrojového kódu programu, nebo jeho binární spustitelné formy pomocí nástroje zvaného profilovač (nebo profilovač kódu ). Profilery mohou používat řadu různých technik, jako jsou metody založené na událostech, statistické, instrumentované a simulační metody.

Shromažďování událostí programu

Profilers používají širokou škálu technik ke sběru dat, včetně hardwarových přerušení , kódového vybavení , simulace sady instrukcí , háčků operačního systému a čítačů výkonu .

Použití profilovačů

Grafický výstup profileru CodeAnalyst .

Nástroje pro analýzu programu jsou nesmírně důležité pro pochopení chování programu. Počítačoví architekti potřebují takové nástroje, aby mohli vyhodnotit, jak dobře budou programy fungovat na nových architekturách . Autoři softwaru potřebují nástroje k analýze svých programů a identifikaci kritických částí kódu. Autoři překladačů často používají tyto nástroje k tomu, aby zjistili, jak dobře funguje jejich plánování instrukcí nebo algoritmus predikce větví ...

-  ATOM, PLDI , '94

Výstupem profilovače může být:

  • Statistický souhrn pozorovaných událostí ( profil )
Souhrnné informace o profilu se často zobrazují anotované proti příkazům zdrojového kódu, kde k událostem dochází, takže velikost naměřených dat je lineární k velikosti kódu programu.
/* ------------ source------------------------- count */             
0001             IF X = "A"                     0055
0002                THEN DO                       
0003                  ADD 1 to XCOUNT           0032
0004                ELSE
0005             IF X = "B"                     0055
  • Proud zaznamenaných událostí ( stopa )
U sekvenčních programů je obvykle dostatečný souhrnný profil, ale problémy s výkonem v paralelních programech (čekání na zprávy nebo problémy se synchronizací) často závisí na časovém vztahu událostí, což vyžaduje úplné trasování, aby bylo možné pochopit, co se děje.
Velikost (úplné) stopy je lineární k délce cesty instrukční cesty programu , což je poněkud nepraktické. Trasu lze proto zahájit v jednom bodě programu a ukončit v jiném bodě, aby se omezil výstup.
  • Probíhající interakce s hypervisorem (například nepřetržité nebo pravidelné monitorování prostřednictvím zobrazení na obrazovce)
To poskytuje příležitost zapnout nebo vypnout trasování v jakémkoli požadovaném bodě během provádění kromě prohlížení průběžných metrik o (stále prováděném) programu. Poskytuje také příležitost pozastavit asynchronní procesy v kritických bodech a podrobněji zkoumat interakce s jinými paralelními procesy.

Profilovač lze použít na jednotlivou metodu nebo v měřítku modulu nebo programu k identifikaci úzkých míst výkonu tím, že je zřejmý dlouhotrvající kód. Profilovač lze použít k pochopení kódu z hlediska časování s cílem optimalizovat jej tak, aby zvládl různé podmínky běhu nebo různá zatížení. Výsledky profilování lze využít pomocí kompilátoru, který poskytuje optimalizaci podle profilu . Výsledky profilování lze použít jako vodítko pro návrh a optimalizaci individuálního algoritmu; Krauss odpovídající zástupné znaky algoritmus je uveden příklad. Profilery jsou zabudovány do některých systémů pro správu výkonu aplikací, které agregují data profilování a poskytují přehled o transakčních úlohách v distribuovaných aplikacích.

Dějiny

Nástroje pro analýzu výkonu existovaly na platformách IBM / 360 a IBM / 370 od začátku 70. let, obvykle na základě přerušení časovače, které zaznamenávaly stavové slovo programu (PSW) v nastavených intervalech časovače, aby detekovaly „horká místa“ při provádění kódu. Toto byl časný příklad odběru vzorků (viz níže). Na začátku roku 1974 povolily simulátory sady instrukcí úplné trasování a další funkce sledování výkonu.

Profilová analýza programu na Unixu sahá až do roku 1973, kdy unixové systémy obsahovaly základní nástroj prof, který uváděl každou funkci a kolik času na provedení programu použila. V roce 1982 gprofbyl koncept rozšířen o kompletní analýzu grafu volání .

V roce 1994 Amitabh Srivastava a Alan Eustace ze společnosti Digital Equipment Corporation zveřejnili dokument popisující ATOM (Analysis Tools with OM). Platforma ATOM převádí program na svůj vlastní profiler: v době kompilace vloží kód do programu, který má být analyzován. Tento vložený kód vydává analytická data. Tato technika - modifikace programu pro vlastní analýzu - je známá jako „ instrumentace “.

V roce 2004 se oba dokumenty gprofa noviny ATOM objevily na seznamu 50 nejvlivnějších článků PLDI za 20leté období končící v roce 1999.

Typy profilů založené na výstupu

Plochý profilovač

Ploché profilovače vypočítávají průměrné časy volání z volání a nerozdělují časy volání na základě volaného nebo kontextu.

Profily grafů volání

Profily profilů grafů volání ukazují časy volání a frekvence funkcí a také příslušné řetězce volání na základě volaného. U některých nástrojů není zachován plný kontext.

Profilovač citlivý na vstup

Profily citlivé na vstup přidávají další dimenzi profilům plochých nebo grafů volání grafů tím, že vztahují měřítka výkonu k funkcím vstupních úloh, jako je velikost vstupu nebo vstupní hodnoty. Generují grafy, které charakterizují, jak se výkon aplikace mění v závislosti na jejím vstupu.

Granularita dat v typech profilerů

Profilery, které jsou také samotnými programy, analyzují cílové programy shromažďováním informací o jejich provádění. Na základě jejich granularit dat, podle toho, jak profilovači shromažďují informace, jsou klasifikováni do profilů založených na událostech nebo statistik. Profilery přerušují provádění programu, aby shromažďovaly informace, které mohou mít za následek omezené rozlišení v časových měřeních, které by mělo být bráno s rezervou. Profily profilů základních bloků hlásí počet cyklů hodin stroje věnovaných provádění každého řádku kódu nebo časování založené na jejich sčítání; časování hlášené na základní blok nemusí odrážet rozdíl mezi zásahy do mezipaměti a neúspěchy.

Profilovače založené na událostech

Zde uvedené programovací jazyky mají profilovače založené na událostech:

  • Java : Rozhraní JVMTI (JVM Tools Interface) API, dříve JVMPI (JVM Profiling Interface), poskytuje háčky profilerům pro zachycování událostí, jako jsou volání, načítání tříd, uvolňování, vlákno, vstup, dovolená.
  • .NET : Může připojit agenta profilování jako server COM k CLR pomocí Profiling API . Podobně jako Java poskytuje běhový modul různá zpětná volání agentovi pro zachycení událostí, jako je metoda JIT / enter / leave, vytvoření objektu atd. Obzvláště silný v tom, že profilovací agent může libovolným způsobem přepsat bytecode cílové aplikace.
  • Python : Profilování Pythonu zahrnuje modul profilu, hotshot (který je založen na grafu volání) a použití funkce 'sys.setprofile' k zachycení událostí jako c_ {call, return, exception}, python_ {call, return, exception}.
  • Ruby : Ruby také používá pro profilování podobné rozhraní jako Python. Plochý profiler v profile.rb, modulu a ruby-prof a C-rozšíření jsou přítomny.

Statistické profily

Některé profilovače pracují na základě vzorkování . Profiler vzorkování sonduje zásobník volání cílového programu v pravidelných intervalech pomocí přerušení operačního systému . Profily vzorkování jsou obvykle méně numericky přesné a konkrétní, ale umožňují cílovému programu běžet téměř plnou rychlostí.

Výsledná data nejsou přesná, ale statistická aproximace. „Skutečná míra chyby je obvykle více než jedno období vzorkování. Ve skutečnosti, pokud je hodnota nnásobkem doby vzorkování, očekávaná chyba v ní je druhou odmocninou n období vzorkování.“

V praxi mohou profily vzorkování často poskytnout přesnější obrázek o provádění cílového programu než jiné přístupy, protože nejsou tak rušivé pro cílový program, a proto nemají tolik vedlejších účinků (například na mezipaměti paměti nebo instrukce) dekódování potrubí). Také proto, že příliš neovlivňují rychlost provádění, mohou detekovat problémy, které by jinak byly skryty. Jsou také relativně imunní vůči přehodnocování nákladů na malé, často nazývané rutiny nebo „těsné“ smyčky. Mohou zobrazit relativní čas strávený v uživatelském režimu v porovnání s režimem přerušitelného jádra, jako je například zpracování systémových volání .

Přesto kód jádra pro zpracování přerušení s sebou nese menší ztrátu cyklů CPU, odkloněné využití mezipaměti a není schopen rozlišit různé úkoly, které se vyskytují v nepřerušitelném kódu jádra (aktivita v mikrosekundovém rozsahu).

Vyhrazený hardware může jít nad rámec tohoto: ARM Cortex-M3 a některé nedávné rozhraní MIPS procesorů JTAG mají registr PCSAMPLE, který vzorkuje programové počítadlo skutečně nezjistitelným způsobem, což umožňuje nerušivý sběr plochého profilu.

Některé běžně používané statistické profilers pro Java / spravovaném kódu jsou SmartBear Software 's AQtime a Microsoft ' s CLR Profiler . Tyto profilers také podporují nativní kód profilování, spolu s Apple Inc ‚s žralok (OSX), oprofile (Linux), Intel VTune a paralelní zesilovač (část Intel Parallel Studio ) a Oracle Performance Analyzer , mezi ostatními.

Instrumentace

Tato technika efektivně přidává pokyny do cílového programu ke shromažďování požadovaných informací. Pamatujte, že vybavení programu může způsobit změny výkonu a v některých případech může vést k nepřesným výsledkům a / nebo heisenbugům . Účinek bude záviset na tom, jaké informace se shromažďují, na úrovni nahlášených podrobností o časování a na tom, zda se ve spojení s instrumentací použije základní profilování bloku. Například přidání kódu k počítání každého volání procedury / rutiny bude mít pravděpodobně menší účinek než počítání, kolikrát je každý příkaz dodržen. Několik počítačů má speciální hardware pro shromažďování informací; v tomto případě je dopad na program minimální.

Přístrojové vybavení je klíčem k určení úrovně kontroly a množství časového rozlišení dostupného pro profilovače.

  • Ruční : Provádí programátor, např. Přidáním pokynů k výslovnému výpočtu doby běhu, jednoduše spočítat události nebo volání k měřicím API , jako je standard Application Response Measurement .
  • Automatická úroveň zdroje : instrumentace přidaná do zdrojového kódu automatickým nástrojem podle zásad instrumentace.
  • Intermediate language : instrumentation added to assembly or decompiled bytecodes giving support for multiple higher-level source languages ​​and preventing (non-symbolic) binary offset re-writing issues.
  • Kompilátor pomáhal
  • Binární překlad : Nástroj přidává instrumentaci do kompilovaného spustitelného souboru .
  • Runtime instrumentace : Přímo před provedením je kód instrumentován. Provádění programu je plně kontrolováno a řízeno nástrojem.
  • Runtime injection : Lehčí než runtime instrumentace. Kód je za běhu upraven tak, aby měl skoky na pomocné funkce.

Tlumočnické vybavení

  • Možnosti ladění tlumočníka mohou povolit shromažďování metrik výkonu, když tlumočník narazí na každý cílový příkaz. A bytecode , ovládání stolů nebo JIT tlumočníci jsou tři příklady, které obvykle mají úplnou kontrolu nad prováděním cílového kódu, což umožňuje extrémně komplexní možnosti sběru dat.

Hypervisor / Simulátor

  • Hypervisor : Data jsou shromažďována spuštěním (obvykle) nemodifikovaného programu pod hypervisorem . Příklad: SIMMON
  • Simulátor a hypervisor : Data se shromažďují interaktivně a selektivně spuštěním nemodifikovaného programu v simulátoru instrukční sady .

Viz také

Reference

externí odkazy