Portál AbcLinuxu, 15. července 2025 05:19


Dotaz: Ako dobrá je optimalizácia kompilátora?

13.8.2010 08:46 rastos | skóre: 63 | blog: rastos
Ako dobrá je optimalizácia kompilátora?
Přečteno: 430×
Odpovědět | Admin
Niekedy som čítal diskusie, v ktorých sa tvrdilo, že kompilátor je niekedy až prekvapivo prefíkaný v oblasti optimalizácie. Týka sa to aj matematických operácií?

Napríklad ak mám kód, ktorý počíta (a-b)/(c-d) a o pár riadkov nižšie v tej istej funkcii mám (c-d)/(a-b), dokáže kompilátor využiť to, že jedno je obrátenou hodnotou druhého, alebo aspoň to, že tie rozdiely už má spočítané?

Zaujíma ma to predovšetkým pre Sun-ovskú javu a gcc/msvc, ale zaujímavé budú aj odpovede pre iné kompilátory a jazyky.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.8.2010 10:42 JS
Rozbalit Rozbalit vše Re: Ako dobrá je optimalizácia kompilátora?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejsem zadny velky odbornik pres kompilatory, ale zkusim odpovedet.

Stejne vyrazy (v tomto pripade ty rozdily) by mely kompilatory umet optimalizovat, viz.

Spocitat prevracenou hodnotu je IMHO stejne slozite jako obycejne deleni, takze v tomto pripade se tim nic neusetri.
17.8.2010 18:58 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Ako dobrá je optimalizácia kompilátora?
Pokud počítá v celých číslech, tak jo. Pokud nenastane div 0 nebo rovnost těch dvou, tak je výsledek jednoho z výrazů vždy nula :-D.
13.8.2010 11:58 Ivan
Rozbalit Rozbalit vše Re: Ako dobrá je optimalizácia kompilátora?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Hadam, ze ty rozdily si pamatovat bude. Problem muze byt v tom, ze neco co je podobne/stejne matematicky nemusi byt podobne "numericky". Co kdyz jsou a,b unsigned a jejich rozdilem je zaporne cislo? Co kdyz plati c==d?

V matematice plati ze 1/1/n == n. Na pocitaci to platit nemusi.

luta avatar 13.8.2010 12:54 luta | skóre: 20 | blog: muj_blok | Prostějov/Brno
Rozbalit Rozbalit vše Re: Ako dobrá je optimalizácia kompilátora?
Odpovědět | | Sbalit | Link | Blokovat | Admin

tak to zkompiluj a mrkni se co z toho vylezlo..já to tak normálně na AVR a gcc dělám..optimalizuje se to dost..některé věci vynechává ale jde spíš o nějaké temp promněnné apod..když zjistí že nejsou třeba

17.8.2010 17:38 mimi.vx | skóre: 37 | blog: Mimi.VX | Praha
Rozbalit Rozbalit vše Re: Ako dobrá je optimalizácia kompilátora?
Odpovědět | | Sbalit | Link | Blokovat | Admin

ono , v uz delsi dobu je rychlejsi neco zpocitat nez to vyvolavat z hloubky pameti....

USE="-gnome -kde";turris
18.8.2010 11:20 __dark__
Rozbalit Rozbalit vše Re: Ako dobrá je optimalizácia kompilátora?
Nevic jestli se v tomto případě jedná o čtění něčeho z paměti, ten mezivýsledek může být klidně v registru nebo hodně blízko na zásobníku.
18.8.2010 11:21 __dark__
Rozbalit Rozbalit vše Re: Ako dobrá je optimalizácia kompilátora?
*nevim
18.8.2010 11:19 __dark__
Rozbalit Rozbalit vše Re: Ako dobrá je optimalizácia kompilátora?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Přečti si toto http://www.redhat.com/magazine/002dec04/features/gcc/ , je to takový úvod. To o čem píšeš je vcelku jednoduchá optimalizace, překladač by měl umět si to najít a použít už spočítaný výsledek. Problém nastává u floating point, třeba tento kód nebude normálně optimalizovaný:
void fn(float a, float b, float c)
{
  float x = a + b + c;
  float y = c + b + a; // spočítá se znovu.

  // ...
}
Toto chování lze změnit, doporučuju podívat se na možnosti svého překladače.

Pokud se bavíme o dynamicky typovaných jazycích, tak tam jsou optimalizace tohoto typu nulové, překladač může optimalizovat maximálně výpočty konstant - třeba 3+5.
Aleš Janda avatar 23.8.2010 20:30 Aleš Janda | skóre: 23 | blog: kýblův blog | Praha
Rozbalit Rozbalit vše Re: Ako dobrá je optimalizácia kompilátora?
Můžu se zeptat u tohoto konkrétního příkladu, proč se výraz spočítá znovu? Je to kvůli možné chybě zaokrouhlování?
23.8.2010 20:48 Ivan
Rozbalit Rozbalit vše Re: Ako dobrá je optimalizácia kompilátora?
JJ, ac se to nezda tak scitani ani nasobeni neni asociativni: http://en.wikipedia.org/wiki/Floating_point

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.