Tipy pro vylepšení časově kritický kód
Rychlé psaní vyžaduje znalost všech aspektů aplikace a interakci se systémem.Toto téma popisuje některé patrnější kódovací techniky k zajištění uspokojivě provádět čas kritické části kódu alternativy.
Sumarizaci, zlepšení časově kritický kód vyžaduje, aby se:
Víte, které části programu musí být rychlé.
Víte, velikosti a rychlosti vašeho kódu.
Znáte náklady 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 nástroj Sledování výkonu (perfmon.exe).
Přístupy do mezipaměti a stránkování
Řazení a vyhledávání
MFC a knihoven tříd
Sdílené knihovny
Haldách
Podprocesy
Malý pracovní sady
Neúspěšné přístupy do mezipaměti a stránkování
Minutí přístupy do mezipaměti na obou interní a externí mezipaměť, stejně jako stránkování (Přechod do sekundárního úložiště pro program pokyny a údaje) pomalý výkon programu.
Přístup do mezipaměti procesoru lze náklady v cyklech hodin 10–20 program.Přístupů mezipaměti externích lze náklady 20–40 hodiny cyklů.Neplatnost stránky lze náklady jeden milion hodin cyklů (za předpokladu procesor, který zpracovává 500 milionů za sekundu, pokyny a čas 2 milisekunda selhání stránky).Proto je v nejlepším zájmu provádění programu psát kód, který sníží počet přístupů do mezipaměti zmeškaných a stránkování.
Důvod pomalé programy je, že přijmout další chyby stránek nebo častěji, než je nezbytné přehlédnout mezipaměti.Vyhnout, je důležité použít datové struktury s dobré místo odkazu, což znamená uchování související věci dohromady.Někdy zjistíte datová struktura, která vypadá skvěle být horrible z důvodu špatné místo odkazu a někdy pravdou.Zde jsou dva příklady:
Dynamicky přidělený propojené seznamy mohou snižovat výkon programu, protože při hledání položky nebo procházet seznam do konce každého přeskočené propojení nelze přehlédnout mezipaměti nebo způsobit neplatnost stránky.Seznam provádění jednoduchých polí na základě skutečně pravděpodobně mnohem rychlejší, lepší ukládání do mezipaměti a méně chyby stránek i – umožňující skutečnost, že pole by bylo těžší růst stále může být rychlejší.
Zatřiďovací tabulky, které používat dynamicky přiřazovány propojené seznamy může snížit výkon.Rozšíření, může provádět zatřiďovací tabulky, které slouží k ukládání jejich obsah dynamicky přiřazené propojené seznamy podstatně horší.Ve skutečnosti v konečné fázi jednoduché hledání lineární řadou skutečně pravděpodobně rychlejší (v závislosti na okolnostech).Hash založené na pole tabulky (takzvané "uzavřené hash") je často přehlédnout implementace, která má často vynikající výkon.
Řazení a vyhledávání
Řazení je ze své podstaty časově náročné ve srovnání s mnoha běžné operace.Nejlepší způsob, jak se vyhnout zbytečnému zpomalování je zamezit řazení v důležitých časech.Budete moci:
Odložit do doby než performance–critical řazení.
Řazení dat v okamžiku dříve, než performance–critical.
Seřadit pouze část dat, které skutečně řazení.
Někdy můžete sestavit seznam v seřazeném pořadí.Buďte opatrní, protože pokud potřebujete vložit data seřazená, může vyžadovat složitější strukturu dat s špatné místo odkazu, vedoucí k Neúspěšné přístupy do mezipaměti a stránkování.Neexistuje žádný přístup, který pracuje ve všech případech.Zkuste několika přístupy a opatření rozdílům.
Zde jsou některé obecné tipy pro řazení:
Minimalizace chyb pomocí akcií řazení.
Je každá práce, můžete předem snížit složitost řazení.Pokud jednorázové průchod přes data porovnání zjednodušuje a snižuje o řazení (n protokolu n) a O (n), vám bude téměř jistě přijdete dopředu*.*
Přemýšlejte o lokalita algoritmus řazení a dat, které očekáváte, na odkaz.
Jsou méně alternativy pro hledání než pro řazení.Pokud je čas kritické hledání, binární vyhledávání vyhledávání nebo hash tabulky je téměř vždy nejlepší, ale jako s řazením, uchovává lokality v úvahu.Lineární hledání přes malé pole může být rychlejší než binární hledání strukturou dat s velkým ukazatele způsobuje chyby stránek nebo Neúspěšné přístupy do mezipaměti.
MFC a knihoven tříd
Tříd Microsoft Foundation (MFC) výrazně zjednodušit psaní kódu.Při psaní kódu v časové tísni, by měla být vědoma některých tříd v režii.Kód MFC, zda splňuje funkční požadavky používající kód času důležité zkontrolujte.Následující seznam uvádí tříd MFC a funkce, které je třeba věnovat pozornost:
CStringMFC volá C Runtime library přidělit paměť pro CString dynamicky.Obecně řečeno CString je nejúčinnější jiných dynamicky přiřazovány řetězec.Stejně jako jakýkoli řetězec dynamicky přiřazené má režii dynamického přidělení a uvolnění.Často jednoduché char pole v zásobníku může sloužit ke stejnému účelu a je rychlejší.Nepoužívejte CString k uložení konstantní řetězec.Použití const char * místo.Všechny operace provádět s CString objekt má některé nároky.Pomocí knihovny runtime funkcí pro řetězce může být rychlejší.
CArrayA CArray poskytuje flexibilitu regulární matice není, ale program, není nutné.Pokud znáte určité mezní hodnoty pro pole, je použít globální pole pevné.Používáte-li CArray, použijte CArray::SetSize jeho velikost a počet prvků, kterými roste při přeřazení je nutné zadat.Přidání prvků jinak, může způsobit pole často přerozděleny a zkopírován, která je neefektivní a můžete rozdělit paměti.Také si uvědomte, je-li položku vložit do pole, CArray přesune následující položky v paměti a může být nutné zvětšit matice.Tato akce může způsobit Neúspěšné přístupy do mezipaměti a stránkování.Jestliže pomocí kódu, který používá MFC, vidět, že něco podrobnější můžete psát vaše scénáře ke zlepšení výkonu.Od CArray je šablona, například může poskytnout CArray specializace pro specifické typy.
CList CList je dvakrát propojeného seznamu, takže prvek vložení je rychlé v čele, značka a na známé pozici (pozice) v seznamu.Vyhledáním prvku hodnotu nebo index vyžaduje sekvenční vyhledávání, však může být pomalé, pokud je dlouhý seznam.Kód nevyžaduje dvakrát propojeného seznamu je vhodné zvážit použití CList.Pomocí jednotlivě propojeného seznamu uloží režii aktualizace další ukazatele pro všechny operace, stejně jako paměť pro tento ukazatel.Další paměť není velký, ale je další příležitost pro Neúspěšné přístupy do mezipaměti nebo stránkování.
IsKindOfTuto funkci lze generovat mnoho volání a přístup k velké množství paměti v různých oblastech vedoucí k chybné místo odkazu.Je užitečné při ladění sestavení (v voláním výrazu, například), ale je vhodné používat ve verzi sestavení.
PreTranslateMessagePoužití PreTranslateMessage strom systému Windows potřebuje různé klávesové zkratky nebo zpracování zpráv je nutné vložit do zprávy čerpadla.PreTranslateMessagezmění MFC odeslání zprávy.Pokud je přepsat PreTranslateMessage, tak pouze na úrovni potřebné.Není například nutné potlačit CMainFrame::PreTranslateMessage Pokud vás zajímají pouze na děti určitého zobrazení zprávy.Přepsat PreTranslateMessage místo pro zobrazení třídy.
Neobchází odeslání normální cestu pomocí PreTranslateMessage zpracovat všechny zprávy odeslané do kteréhokoli okna.Použití postupy okno a mapuje MFC zprávy pro tento účel.
OnIdleNečinné události může dojít v době neočekáváte, jako mezi WM_KEYDOWN a WM_KEYUP události.Časovače může být efektivnější způsob, jak spustit kód.Vynutit OnIdle volán opakovaně generování zpráv false nebo vždy vrací TRUE z lokální změna z OnIdle, nikdy by umožnila vaše vlákno do režimu spánku.Znovu, časovače nebo samostatný podproces pravděpodobně vhodnější.
Sdílené knihovny
Opětovné použití kódu je žádoucí.Ale pokud hodláte použít kód jiného uživatele, nezapomeňte víte přesně čemu v těch případech, kde je pro vás důležité výkonu.Nejlepší způsob, jak rozumíte je krokování zdrojový kód nebo měřicí nástroje PView nebo sledování výkonu.
Haldách
Použití více haldách uvážlivě.Další haldách vytvořen s HeapCreate a HeapAlloc umožňují spravovat a potom nakládat související sady přidělení.Příliš mnoho paměti není potvrzena.Pokud používáte více haldách, věnujte zvláštní pozornost množství paměti je zpočátku potvrzena.
Namísto více haldách můžete pomocné funkce rozhraní mezi kódu a výchozí haldy.Pomocné funkce usnadnění přidělení vlastní strategie, které můžete zlepšit výkon aplikace.Například malé přidělení často provádíte, můžete tyto příděly na jednu část výchozí haldy lokalizovat.Můžete přidělit velký blok paměti a potom pomocí funkce Pomocník suballocate z bloku.Pokud tento postup jste další haldách s nevyužité paměti protože přidělení přichází z výchozí haldy.
V některých případech však pomocí výchozí haldy můžete snížit místo odkazu.Použijte k měření účinků přesouvání objektů z haldy haldy procesu prohlížeč, Spy ++ nebo sledování výkonu.
Měření v haldách tak můžete účet pro každý přidělení na haldy.Použití C Runtime ladění rutin haldy do kontrolního bodu a vypsat vaše haldy.Můžete číst výstup do tabulkového programu, například Microsoft Excel a kontingenční tabulky použít k zobrazení výsledků.Poznámka: Celkový počet, velikost a rozdělení přidělení.Porovnejte je s velikost pracovní sady.Podívejte se také na clustering velikosti související objekty.
Čítače výkonu můžete také sledovat využití paměti.
Podprocesy
Úlohy na pozadí účinné nečinnosti zpracování událostí může být rychlejší než pomocí podprocesů.Je snazší porozumět místo odkazu v programu s jediným podprocesem.
Dobrým pravidlem je podproces pouze pokud je operační systém oznámení, která zablokovat v kořenu práce pozadí.Podprocesy jsou nejlepší řešení v takovém případě je nepraktické blokovat hlavní podproces na události.
Podprocesy představují také problémy s komunikací.Je třeba spravovat komunikační spojení mezi vaší podprocesů se seznamem zpráv nebo přidělením a pomocí sdílené paměti.Správa komunikační spojení obvykle vyžaduje synchronizaci vyhnout sporech a zablokování problémy.Této složitosti lze snadno změnit na chyby a problémy s výkonem.
Další informace naleznete v tématu Nečinnosti smyčku zpracování a při souběžném.
Malý pracovní sady
Menší pracovní sady znamenat lepší místo odkazu, méně chyb stránek a další přístupy do mezipaměti.Pracovní sada procesu je nejblíže metrika používaný operační systém přímo pro měřicí lokality odkaz.
Horní a dolní limit pracovní sady je možné nastavit pomocí SetProcessWorkingSetSize.
Chcete-li horní a dolní limit pracovní sady, použijte GetProcessWorkingSetSize.
Chcete-li zobrazit velikost pracovní sady, použijte Spy ++.