Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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.

Předmět Autor Datum
Napíš ich 10 tisíc, a vieš to hneď. Ešte by bolo vhodné doplniť, prečo má byť výsledok operácie celé…
čitateľ 23.04.2017 19:06
čitateľ
Určuje to pixely, kde má být prvek umístěn, takže to musí být celé číslo. Jinak by to bylo jedno.
MichalDM 23.04.2017 21:20
MichalDM
Tak optimální by v tomhle případě bylo: int x = 4;
Wikan 23.04.2017 19:21
Wikan
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…
MichalDM 23.04.2017 21:26
MichalDM
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ředst…
Odoaker 23.04.2017 21:52
Odoaker
Optimalizovať aritmetické operácie na takejto úrovni nemá zmysel. Pokiaľ chceš naozaj porovnávať výk…
los 23.04.2017 23:38
los
Konštantné výrazy optimalizuje aj ten najprimitívnejší kompilátor, takže by to malo byť úplne jedno,…
los 23.04.2017 20:24
los
Druhý spôsob nemusí vždy fungovať, napr. int x=45*14/5; //x=126 int y=(int)(45*2.8); //y=125 Rýchl… poslední
x22 24.04.2017 12:37
x22

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.

Zpět do poradny Odpovědět na původní otázku Nahoru