
Java - optimálnější kód
Dobrý den,
Jednoduchá otázka - který kód je optimálnější/rychlejší
int x = 12 * 2 / 5;
nebo
int x = (int) 2 * 2.4;
Chci upozornit, že něco takového je v podstatě zbytečné řešit. Pouze v případě, že bych takových výraz měl asi 10 000x.
Používám způsob 1, ovšem se způsobem 2 je to přehlednější, ale nevím, jestli má cenu to přepisovat.
A proto bych chtěl vědět, jednak z důvodu optimalizace a jednak čistě ze zájmu, který kód proběhne rychleji.
Předem děkuji.
Tak optimální by v tomhle případě bylo:
int x = 4;
Chtěl jsem napsat nějaký příklad a tohle bylo první, co mě napadlo. Ty výpočty tam mám různé.
A navíc jsem pro zjednodušení uvedl int x = 12 * 2 / 5;
Ve skutečnosti místo čísla 2 je proměnná.
Jak píše los, kompilátor by to měl přechroustat a na běh to nemá vliv. Záleží, co to číslo má představovat, ale kdybych si měl vybrat mezi
int x = 2 * 12/5;
int x = (int)(2 * 2.4);
asi beru první, kvůli přesnosti, aj to vypadá líp.
Optimalizovať aritmetické operácie na takejto úrovni nemá zmysel. Pokiaľ chceš naozaj porovnávať výkonnosť aritmetických operácií, tak na výsledok má podstatný vplyv procesor, na ktorom to spúšťaš (vygoogli si napríklad, čo znamená pipelining). Výkon ovplyvní aj kód, ktorý je "okolo" (napr. či sa budú premenné načítavať z pamäte alebo z keše), takže jediný správny spôsob, ako to porovnať, je spraviť si benchmark na takom prostredí, kde chceš dosiahnuť maximálny výkon.
Vo všeobecnosti ak sa bavíme o rýchlosti aritmetických operácií, tak celočíselné operácie sú vždy rýchlejšie ako operácie s pohyblivou rádovou čiarkou. Lenže v tvojom prípade chceš porovnať celočíselné násobenie+delenie (dve operácie) voči jednému násobeniu desatinných čísel. A tam môže byť výsledok naozaj rôzny, pretože delenie patrí medzi "pomalé" aritmetické operácie (ak nedelíš mocninou 2, čo ti prekladač zoptimalizuje na bitový posun). Takže rýchlosť zistíš jedine tak, že ju odmeráš. Otázka je, či to chceš robiť, keď už teraz vieš odhadnúť, že to vo výsledku nebude mať prakticky žiaden vplyv.
Druhý spôsob nemusí vždy fungovať, napr.
Rýchlosť závisí od konkrétneho hardvéru/JVM/kompilátora (pre konštanty je to jedno).