Tipy pro zlepšení časově kritického kódu
Psaní kódu, rychlé vyžaduje Principy všechny aspekty vaše aplikace a interakci se v systému.Toto téma navrhuje alternativy k některé z více zřejmé kódovací techniky a umožňuje zajistit dostatečně provádět čas kritické části kódu.
Chcete-li shrnout, zlepšení čas kritický kód vyžaduje, aby vám:
Zjistěte, jaké části aplikace, musí být rychlé.
Zjistěte, velikosti a rychlosti vašeho kódu.
Znáte náklady na nové funkce.
Znáte minimální práce potřebné k provedení úlohy.
Chcete-li shromáždit informace o výkonu kódu, můžete použít sledování výkonu (perfmon.exe).
Oddíly v tomto článku
Nezdařených přístupů k mezipaměti a chyb stránek
Řazení a vyhledávání
Knihovna MFC a knihovny tříd
Sdílené knihovny
Haldy
Vlákna
Malý pracovní sada
Nezdařených přístupů k mezipaměti a chyb stránek
Načteni přístupů k mezipaměti, na obou interní a externí mezipaměť, stejně jako stránkování (přejdete do sekundárního úložiště program pokyny a data) zpomalit program.
Vstupů do mezipaměti využití procesoru může nákladů váš program 10 – 20 hodin cyklů.Vstupů do mezipaměti externí lze nákladů 20 – 40 clock cyklů.Chyby stránky můžete nákladů cykly clock jeden milion (za předpokladu, že procesor, který zpracovává 500 milionů pokyny za sekundu a čas platnosti 2 milisekund pro stránkování).Je tedy v nejlepším zájmu vykonávání programu psaní kódu, který bude snížit počet přístupů k mezipaměti zmeškaných a stránkování.
Jedním z důvodů pomalé programy je, že provést další chyb stránky nebo přijít mezipaměti častěji než je nezbytné.Chcete-li se tomu vyhnout, je důležité pro použití datových struktur s dobrý lokality odkaz, což znamená společně držet souvisejících akcí.V některých případech, že datovou strukturu, která vypadá skvěle jím být horrible z důvodu špatné lokality odkaz a v některých případech platí opačně.Zde jsou dva příklady:
Dynamicky přidělená propojené seznamy může snížit výkon programu, protože při hledání pro položku nebo procházení seznamu na konec každého přeskočené propojení může přijít do mezipaměti nebo způsobit stránkování.Seznam implementace, založené na jednoduché pole může být ve skutečnosti mnohem rychlejší z důvodu lepší ukládání do mezipaměti a méně chyby stránek i – díky skutečnost, že pole by být těžší roste, přesto může být rychlejší.
Hodnota hash tabulky, které používají dynamicky přiřazovány propojené seznamy může vést ke snížení výkonu.Přípona, může provádět hash tabulek, které slouží k ukládání jejich obsah dynamickým přidělené propojené seznamy podstatně horší.Ve skutečnosti v konečné fázi jednoduché lineární hledání prostřednictvím pole může být ve skutečnosti rychlejší (v závislosti na okolností).Hodnota hash na základě pole tabulky (tzv "uzavřené algoritmu hash") je implementaci často úvahu, která často má vynikající výkonu.
Řazení a vyhledávání
Řazení je vnitřně časově náročné ve srovnání s mnoha typické operací.Nejlepší způsob, jak se vyhnout nepotřebné zpomalení je a vyhnout se tak řazení v kritické dobu.Je pravděpodobně bude moci:
Pozdržet řazení do méně výkonu – závažné doby.
Seřaďte data chvíli dřívější, než výkonu – kritický.
Seřadit pouze část data, která skutečně potřebuje řazení.
V některých případech je možné vytvořit seznam seřazená.Vyhněte se, vzhledem k tomu, že pokud potřebujete k vložení dat seřazená, můžete požadovat složitější datová struktura s špatná lokality, odkaz vede k nezdařených přístupů k mezipaměti a chyb stránek.Neexistuje žádný přístup, který funguje ve všech případech.Zkuste několika přístupy a měr rozdíly.
Zde jsou některé obecné tipy pro řazení:
Použijte burzovní řazení minimalizovat chyby.
Každé dílo, které vám pomohou předem cílem zjednodušit řazení je vhodné.Pokud jednorázové průchodu nad daty zjednodušuje jejich porovnání a řazení do O(n) snižuje O (n protokolu n), můžete se téměř jistě přijdete zařadit.
Zamyslete se lokalita odkaz na algoritmus řazení a očekáváte, že jeho spuštění na data.
Nejsou k dispozici méně alternativy vyhledávání, než pro řazení.Pokud je hledání čas kritické, binární vyhledávání tabulky vyhledávání nebo hodnoty hash je téměř vždy nejlepší, ale stejně jako u řazení, musí zůstat bez kompromisů v lokalitě.Lineární vyhledávání prostřednictvím malé pole můžete být rychlejší než binární vyhledávání prostřednictvím datová struktura s velkým ukazatele, jež způsobuje stránkování nebo Neúspěšné přístupy do mezipaměti.
Knihovna MFC a knihovny tříd
Microsoft Foundation třídy (MFC) může výrazně usnadňuje psaní kódu.Při psaní kódu pro čas kritické, by měl být vědomi režie spojená s některé třídy.Zkontrolujte MFC kód, který používá váš čas kritické kód a zjistěte, zda splňuje vaše požadavky výkonu.Následující seznam uvádí tříd MFC a funkcí, které by mělo být vědomi:
CStringKnihovna MFC volá knihovna C run-time přidělit paměť pro CString dynamicky.Obecně lze říci CString je jako efektivní jako jakýkoli jiný dynamicky přiřazovány řetězec.Stejně jako libovolný dynamickým přidělené řetězec má režii dynamické přidělování a verze.Často jednoduchý char pole v zásobníku mohou sloužit ke stejnému účelu a je rychlejší.Nepoužívám CString k uložení konstantní řetězec.Použití const char * místo.Jakákoli operace můžete provádět s nástrojem CString objekt má určitou režii.Použití knihovny běhu funkce pro řetězce může být rychlejší.
CArrayObjekt CArray poskytuje flexibilitu, že regulární pole není zaškrtnuta, ale nemusí být nutné váš program, který.Pokud znáte zvláštní omezení pro pole, můžete použít globální pole pevné místo.Pokud použijete CArray, použijte CArray::SetSize k vytvoření jeho velikost a zadejte počet elementů, které zvyšuje při nové přidělení je nezbytné.Přidávání elementů v ostatních případech může způsobit pole často znovu přidělit a kopírovat, což je neefektivní a můžete fragmentu paměti.Také je potřeba upozornit, je-li vložit položku do pole, CArray přesune následující položky v paměti a může být nutné k rozvoji pole.Tato akce může způsobit nezdařených přístupů k mezipaměti a stránkování.Je-li projděte kód, který používá MFC, mohou se zobrazit, je možné nějakou další úpravu zapsat do váš scénář, čímž dosáhnete vyššího výkonu.Vzhledem k tomu, CArray je šablona, například můžete zadat CArray odborností pro určité typy.
CList CList je dvakrát propojený seznam, takže element vložení je rychlé na head, značka a na známé pozici (POSITION) v seznamu.Hledání podle hodnoty nebo index elementu vyžaduje sekvenční vyhledávání, však, což může být pomalé, pokud je dlouhý seznam.Pokud váš kód se nevyžaduje dvakrát propojený seznam můžete chtít zvažte použití CList.Použití jednotlivě propojeného seznamu uloží nároky na výkon aktualizace další ukazatele pro všechny operace, a také paměť pro tento ukazatel.Další paměť není skvělé, ale je jiné příležitosti pro nezdařených přístupů k mezipaměti nebo stránkování.
IsKindOfTato funkce může generovat mnoho volání a přístup k velké množství paměti v různých datových oblastech vedoucí k chybné místo odkazu.Je vhodné pro sestavení ladicí verze (v vyhodnocení volání, např.), ale snažte se vyhnout jeho používání ve vydané verzi.
PreTranslateMessagePoužití PreTranslateMessage při strom systému windows potřebuje různé klávesové zkratky nebo při zpracování zpráv je nutné vložit do pumpu zpráv.PreTranslateMessagemění MFC odesílání zpráv.Pokud přepíšete PreTranslateMessage, tedy pouze na úrovni potřeby.Můžete například není nutné k přepsání CMainFrame::PreTranslateMessage Pokud vás zajímají pouze zprávy podřízených objektů v konkrétním zobrazení.Přepsání PreTranslateMessage místo pro zobrazení třídy.
Není obejít normální odesílání cesty pomocí PreTranslateMessage zpracovat všechny zprávy odeslané do libovolného okna.Použití procedury okna a mapu zpráv MFC pro tento účel.
OnIdleNečinnosti může dojít k událostem v některých případech je zobrazena neočekávaně, například jako mezi WM_KEYDOWN a WM_KEYUP události.Časovače může být efektivnější způsob ke spouštění kódu.Neprovádějte OnIdle má být volána opakovaně generováním false zprávy nebo vždy vrácením TRUE z přepsání OnIdle, což by umožnilo nikdy vašeho vlákna spánku.Znovu časovač nebo samostatný podproces může být vhodnější.
Sdílené knihovny
Opětovné použití kódu je žádoucí.Však pokud budete při použití jiného uživatele kódu, můžete by měl Ujistěte se, že víte, přesně jak funguje v případech, kdy výkonu kritické pro vás.Nejlepší způsob, jak to pochopit je zdrojový kód krokovat nebo měřením s nástroji, jako jsou například PView či sledování výkonu.
Haldy
Pomocí více haldy s uvážení.Další haldy vytvořen s HeapCreate a HeapAlloc umožňují spravovat a potom zahodí související sady přidělení.Není předat příliš mnoho paměti.Pokud používáte více haldy, věnujte zvláštní pozornost množství paměti, který je původně potvrzeny.
Namísto více haldy můžete pomocné funkce rozhraní mezi kódu a výchozí haldy.Pomocné funkce usnadnění vlastní přidělení strategie, které může zlepšit výkon aplikace.Pokud provádíte často malé rozdělení, můžete chtít lokalizovat rozdělení těchto prostředků na jednu část výchozí haldy.Můžete přidělit velký blok paměti a potom pomocí pomocné funkce suballocate z tohoto bloku.Pokud v takovém případě nebudete mít další haldy s pamětí nepoužívané vzhledem k tomu, že přidělení nad rovinu výchozí haldy.
V některých případech však pomocí výchozí haldy můžete snížit místo odkazu.K měření účinky přesouvání objektů z haldy haldy pomocí procesu prohlížeč, Spy ++ nebo sledování výkonu.
Měří vaše haldy, tak můžete účet pro každý přidělení do haldy.Použít C run-time ladění haldy rutin kontrolního bodu a vypsat vaše haldy.Můžete číst výstup do tabulkového procesoru jako aplikace Microsoft Excel a kontingenční tabulky se používá k zobrazení výsledků.Všimněte si, celkovým počtem, velikost a rozmístění přidělení.Porovnejte je s velikost pracovní sady.Podívejte se také na clustering související velikosti objektů.
Čítače výkonu můžete také použít k monitorování využití paměti.
Vlákna
Pro úlohy na pozadí může být účinné nečinnosti zpracování událostí rychlejší než použití vlákna.Je snazší pochopit lokality odkaz v programu jeden podproces.
Dobré pravidlo je použití vlákno pouze v případě, že oznámení operačního systému, které můžete blokovat na je v kořenovém adresáři pracovní pozadí.Vlákna jsou nejlepší řešení v takovém případě, protože je proveditelné blokování hlavní vlákna na událost.
Vlákna také nabízejí komunikační problémy.Je třeba spravovat komunikační propojení mezi vlákna, se seznamem zpráv nebo přidělením a používání sdílené paměti.Správa na komunikační linky obvykle vyžaduje, aby synchronizace, aby se zabránilo časování a zablokování problémy.Tato složitost můžete snadno upravit na chyby a problémy s výkonem.
Další informace naleznete v tématu nečinnosti cyklu zpracování a Multithreading.
Malý pracovní sada
Menší pracovní sady znamená lepší lokality odkaz, menšího počtu chyb stránek a další přístupů k mezipaměti.Pracovní sada procesu je nejbližší metriku, kterou v operačním systému přímo poskytuje pro měření místo odkazu.
Chcete-li nastavit horní a dolní limity pracovní sady, použijte SetProcessWorkingSetSize.
Chcete-li získat horní a dolní limity pracovní sady, použijte GetProcessWorkingSetSize.
Chcete-li zobrazit velikost pracovní sady, použijte Spy ++.