Účinnost algoritmu je vlastnost algoritmu , která souvisí s výpočetními zdroji používanými algoritmem. Algoritmus musí být analyzován , aby se určily zdroje potřebné pro algoritmus. Efektivitu algoritmu lze považovat za analogickou s produkčním výkonem opakujících se nebo kontinuálních procesů.
Pro dosažení maximální efektivity chceme snížit spotřebu zdrojů. Různé zdroje (jako je čas a paměť) však nelze přímo porovnávat, takže který z těchto dvou algoritmů je považován za efektivnější, často závisí na tom, který faktor je důležitější, jako je požadavek na vysokou rychlost, minimální využití paměti nebo jiné opatření. účinnosti.
Všimněte si, že tento článek NENÍ o optimalizaci algoritmů, o které pojednávají články optimalizace programu , optimalizace kompilátoru , optimalizace smyčky , optimalizátor objektového kódu atd. Termín „optimalizace“ je sám o sobě zavádějící, protože vše, co lze udělat, spadá pod definici „zlepšení“.Důležitost efektivity s důrazem na dobu provedení zdůraznila Ada Lovelace v roce 1843 na Mechanical Analytical Engine Charlese Babbage :
„Téměř u všech výpočtů je pro úspěšné dokončení procesu možná široká škála konfigurací a výběr pro provádění výpočtů by měly ovlivnit různé konvence. Zásadní je volba takové konfigurace, která povede k minimalizaci času potřebného k provedení výpočtu“ [1] .
Rané elektronické počítače byly velmi omezené jak v rychlosti, tak v paměti. V některých případech bylo zjištěno, že existuje kompromis mezi časem a pamětí , ve kterém úkol musí buď použít velké množství paměti, aby dosáhl vysoké rychlosti, nebo použít pomalejší algoritmus využívající malé množství pracovní paměti. V tomto případě byl použit nejrychlejší algoritmus, pro který byl dostatek volné paměti.
Moderní počítače jsou mnohem rychlejší než ty rané počítače a mají mnohem více paměti (gigabajty místo kilobajtů). Donald Knuth však zdůrazňuje, že účinnost zůstává důležitým faktorem:
"V zavedených inženýrských disciplínách je 12% zlepšení snadno dosažitelné, nikdy to nebylo považováno za pobuřující a věřím, že totéž by mělo platit v programování" [2]
Algoritmus je považován za účinný, pokud zdroj, který spotřebovává (nebo náklady na zdroj), je na nebo pod nějakou přijatelnou úrovní. Zhruba řečeno, „přijatelné“ zde znamená „algoritmus poběží po rozumnou dobu na dostupném počítači“. Vzhledem k tomu, že od 50. let došlo k výraznému nárůstu výpočetního výkonu a dostupné paměti počítačů, nebyla stávající „akceptovatelná úroveň“ přijatelná ani před 10 lety.
Výrobci počítačů pravidelně uvolňují nové modely, často výkonnější . Náklady na software mohou být poměrně vysoké, takže v některých případech je snazší a levnější získat lepší výkon zakoupením rychlejšího počítače, který je kompatibilní s vaším stávajícím počítačem.
Existuje mnoho způsobů, jak měřit zdroje používané algoritmem. Dvě nejpoužívanější měření jsou rychlost a použitá paměť. Další měření mohou zahrnovat přenosovou rychlost, dočasné využití disku, dlouhodobé využití disku, spotřebu energie, celkové náklady na vlastnictví , dobu odezvy na externí signály a tak dále. Mnoho z těchto měření závisí na velikosti vstupů algoritmu (tj. na množství, které je třeba zpracovat). Měření mohou také záviset na způsobu, jakým jsou data prezentována (například některé třídicí algoritmy nefungují dobře na datech, která jsou již setříděna, nebo když jsou data řazena v opačném pořadí).
V praxi existují další faktory, které ovlivňují účinnost algoritmu, jako je požadovaná přesnost a/nebo robustnost. Jak je vysvětleno níže, způsob implementace algoritmu může mít také významný vliv na skutečný výkon, ačkoli mnoho aspektů implementace je otázkami optimalizace.
V teoretické analýze algoritmů je běžnou praxí hodnotit složitost algoritmu v jeho asymptotickém chování, to znamená odrážet složitost algoritmu jako funkci velikosti vstupu n , velký zápis "O" . se používá . Tento odhad je obecně poměrně přesný pro velké n , ale může vést k nesprávným závěrům pro malé hodnoty n (například třídění podle bublin, které je považováno za pomalé, může být rychlejší než „rychlé třídění“, pokud je potřeba pouze několik prvků. seřazeno).
Některé příklady velkého zápisu 'O' :
Označení | název | Příklady |
---|---|---|
trvalý | Určení, zda je číslo sudé nebo liché. Použití vyhledávací tabulky konstantní velikosti. Pomocí vhodné hashovací funkce vyberte prvek. | |
logaritmický | Hledání prvku v seřazeném poli pomocí binárního vyhledávání nebo vyváženého stromu , stejně jako operace na binomické hromadě . | |
lineární | Hledání prvku v netříděném seznamu nebo nevyváženém stromu (nejhorší případ). Sčítání dvou n - bitových čísel pomocí carry through . | |
kvazilineární , logaritmicky lineární | Výpočet rychlé Fourierovy transformace , heapsort , quicksort (nejlepší a průměrný případ), mergesort | |
náměstí | Násobení dvou n -ciferných čísel pomocí jednoduchého algoritmu, bublinové třídění (nejhorší případ), shellové třídění , rychlé třídění (nejhorší případ), výběrové třídění , vkládání třídění | |
exponenciální | Nalezení (přesného) řešení problému obchodního cestujícího pomocí dynamického programování . Určení, zda jsou dva booleovské příkazy ekvivalentní pomocí vyčerpávajícího vyhledávání |
Pro nové verze softwaru nebo pro srovnání s konkurenčními systémy se někdy používají benchmarky k porovnání relativní výkonnosti algoritmů. Pokud je například vydán nový třídicí algoritmus , lze jej porovnat s předchůdci, aby bylo zajištěno, že algoritmus bude na známá data přinejmenším stejně účinný jako ostatní. Benchmarky mohou uživatelé použít k porovnání produktů od různých výrobců, aby vyhodnotili, který produkt bude nejlépe vyhovovat jejich požadavkům z hlediska funkčnosti a výkonu.
Některé benchmarky poskytují způsob, jak porovnávat různé jazyky kompilátoru a interpretu, jako je Roy Longbottom's PC Benchmark Collection [3] a The Computer Language Benchmarks Game porovnává výkon implementací typických úloh v některých programovacích jazycích.
(Je dostatečně snadné vytvořit „ domácí “ testy výkonu, abyste získali představu o relativním výkonu různých programovacích jazyků pomocí sady vlastních kritérií, jako to udělal Christopher Covell-Shah ve svém „shrnutí výkonu devíti jazyků“) [ 4]
Problémy s implementací mohou také ovlivnit skutečný výkon. To zahrnuje volbu programovacího jazyka a způsobu, jakým je algoritmus skutečně kódován, volbu překladače pro zvolený jazyk nebo použité možnosti kompilátoru a dokonce i použitý operační systém. V některých případech může být jazyk implementovaný jako interpret výrazně pomalejší než jazyk implementovaný jako kompilátor [5] .
Existují další faktory, které mohou ovlivnit využití času nebo paměti, které jsou mimo kontrolu programátora. To zahrnuje zarovnání dat , granularitu garbage collection , paralelismus na úrovni instrukcí a volání podprogramů .
Některé procesory mají schopnost provádět vektorové operace , což umožňuje jediné operaci zpracovat více operandů. Může nebo nemusí být snadné používat takové funkce na úrovni programování nebo kompilace. Algoritmy navržené pro sériové výpočty bude možná nutné zcela přepracovat, aby mohly používat paralelní výpočty .
Další problém může nastat s kompatibilitou procesorů, ve kterých mohou být instrukce implementovány odlišně, takže instrukce na některých modelech mohou být na jiných modelech relativně pomalejší. To může být problém pro optimalizační kompilátor.
Měření se obvykle vyjadřují jako funkce vstupní velikosti n .
Dvě nejdůležitější měření jsou:
Pro počítače napájené bateriemi (např. notebooky ) nebo pro velmi dlouhé/velké výpočty (např. superpočítače ) je zajímavý jiný druh měření:
V některých případech jsou zapotřebí jiná, méně běžná měření:
Pro analýzu algoritmů se obvykle používá analýza časové složitosti algoritmu k odhadu doby běhu jako funkce velikosti vstupních dat. Výsledek je obvykle vyjádřen jako "O" velké . To je užitečné pro porovnávání algoritmů, zejména při zpracování velkého množství dat. Je-li množství dat malé, jsou potřebné podrobnější odhady pro porovnání algoritmů (ačkoli tato situace pravděpodobně nezpůsobí problémy). Algoritmy, které zahrnují paralelní výpočty, může být obtížnější analyzovat.
CvičeníPoužívají se srovnávací testy doby běhu algoritmu. Mnoho programovacích jazyků obsahuje funkce, které odrážejí dobu využití procesoru. U dlouhotrvajících algoritmů může být zajímavý také uplynulý čas. Výsledky v obecném případě by měly být zprůměrovány ze série testů.
Tento druh testu může být velmi citlivý na konfiguraci hardwaru a na schopnost jiných programů běžet současně v prostředí s více procesory a multitaskingem .
Tento typ testů také výrazně závisí na volbě programovacího jazyka, kompilátoru a jeho možnostech, takže porovnávané algoritmy musí být implementovány za stejných podmínek.
Tato část se zabývá použitím hlavní paměti (často RAM) vyžadované algoritmem. Stejně jako u časové analýzy výše, analýza algoritmu obvykle používá analýzu prostorové složitosti algoritmu k odhadu požadované paměti za běhu jako funkce velikosti vstupu. Výsledek je obvykle vyjádřen jako "O" velké .
Existují čtyři aspekty využití paměti:
Rané elektronické počítače a domácí počítače měly relativně malou pracovní paměť. Takže v roce 1949 měl EDSAC maximální pracovní paměť 1024 17bitových slov a v roce 1980 byl vyroben Sinclair ZX80 s 1024 bajty pracovní paměti.
Moderní počítače mohou mít relativně velké množství paměti (možná gigabajty), takže komprimace paměti používané algoritmem do daného množství paměti trvá méně, než tomu bylo dříve. Podstatná je však existence tří různých kategorií paměti:
Algoritmus, jehož požadovaná paměť se vejde do mezipaměti počítače, běží mnohem rychleji než algoritmus, který se vejde do hlavní paměti, která bude zase mnohem rychlejší než algoritmus využívající virtuální prostor. Vše komplikuje skutečnost, že některé systémy mají až tři úrovně mezipaměti. Různé systémy mají různé množství těchto typů paměti, takže vliv paměti na algoritmus se může mezi jednotlivými systémy výrazně lišit.
V počátcích elektronických počítačů, pokud se algoritmus a jeho data nevešly do hlavní paměti, nemohl být použit. V dnešní době používání virtuální paměti poskytuje obrovskou paměť, ale za cenu výkonu. Pokud se algoritmus a jeho data vejdou do mezipaměti, lze dosáhnout velmi vysoké rychlosti, takže minimalizace požadované paměti pomáhá minimalizovat čas. Algoritmus, který se zcela nevejde do mezipaměti, ale zajišťuje lokalitu odkazu , může běžet relativně rychle.
Programy se zpomalují rychleji než počítače.
May říká:V rozšířených systémech může snížení provádění instrukcí na polovinu zdvojnásobit životnost baterie a velká data umožňují lepší algoritmy: Snížení počtu operací z N x N na N x log(N) má silný účinek u velkých N... Pro N=30 miliard, tyto změny jsou podobné 50 letům technologických vylepšení.
Následující soutěže vás zvou k účasti na vývoji nejlepších algoritmů, jejichž kvalitativní kritéria určují porotci:
Kvalita softwaru | |||||
---|---|---|---|---|---|
Charakteristika |
| ||||
Normy a doporučení |
| ||||
Procesy a organizace |
|