Znáte ten pocit, kdy Vás napadne podle Vás skvělá myšlenka, tu začnete implementovat a přijdete na to, že to v praxi nebude úplně přesně fungovat jak si člověk vymyslel, ale je Vám líto to vyhodit, protože jsou v tom určité myšlenky, které se někomu mohou hodit? Tak to je případ dnešního kódu.
Onehdy mne napadlo, že by bylo zajímavé se napíchnout na memory manager a zkusit nějak vyhodnocovat jeho volání a tento obsah pak použít jako podklad pro různé optimalizace, resp. hledání neefektivních částí programu.
Malá vsuvka pro neznalé: veškeré alokace a uvolňování včetně řetězců jdou přes 3 (5) funkcí. Na tyto funkce je navěšen správce paměti (většinou FastMM), který optimalizuje alokace dle potřeb Delphi programů. Je možné napsat (např. správce paměti bez optimalizace) - tj. přímo volání OS, ale je to pomalé řešení.
Takže jsem napsal malý unit, který se napíchne na tato volání a vypisuje velikosti alokací a uvolňování a adresu. Navíc při uvolňování špinavým trikem zjistí v případě, že se jedná o následníka TObject název třídy a pokud to není objekt, tak zkusí vypsat pár znaků jako kdyby to byl řetězec. Je to zkopírované z informací FastMM, ale je to přinejmenším zajímavé. Původně jsem myslel, že budu schopen i zobrazit jméno objektu v případě že se jedná o komponentu, ale v okamžiku uvolňování objektu je již řetězec s názvem komponenty uvolněn.
No jako cvičení to bylo zajímavé a třeba to někomu pomůže.
Jen poznámka: veškeré operace během alokace a uvolňování musí být psány s ohledem na to, že nesmí dojít k další alokaci, tj. pozor na řetezce atd.
Download: Memtrace (1K). Stačí přidat do uses, hned za FastMM (resp. co nejdříve v projektu).