operacje matematyczne

0

Tak się zastanawiałem co jest szybsze
18601000
czy
18000*60

teoretycznie powinno być szybsze 18000*60, ale czy nie przeszkadza że musi mnożyć przez duża liczbę? A czy zawsze jedna z tych opcji będzie szybsza dla wszystkich operacji?

1

Tak się zastanawiałem co jest szybsze

Wszystko zostanie zoptymalizowane w czasie kompilacji :]

2

@fasadin tak jak napisał @Patryk27, kompilator sobie to policzy i wstawi na sztywno w kodzie.
Ale tak czysto akademicko, zakładając że kompilator nic nie optymalizuje, mnożenie jest zaimplementowane na poziomie procesora i zawsze wykonuje się na "całych liczbach" w sensie całego ich zapisu bitowego, więc kwestia większej czy mniejszej liczby nie ma absolutnie znaczenia. Ma za to znaczenie ile operacji mnożenia wykonujesz, bo każda z nich to jest osobe wywołanie instrukcji mul.

1

K woli ścisłości, niektóre mnożenia (oraz dzielenia, ba zwłaszcza dzielenia) da się zrobić o wiele szybciej (chodzi o mnożenia/dzielenie przez potęgi dwójki) zastępując mnożenie/dzielenie przesunięciem bitowym.
np:
y=x*8;
jest wolniejszą wersją:
y=x<<3;
lub:
y/=32;
jest o wiele wolniejszą wersją:
y>>=5;

0
_13th_Dragon napisał(a):

K woli ścisłości, niektóre mnożenia (oraz dzielenia, ba zwłaszcza dzielenia) da się zrobić o wiele szybciej (chodzi o mnożenia/dzielenie przez potęgi dwójki) zastępując mnożenie/dzielenie przesunięciem bitowym.

Pod warunkiem, że takich operacji kompilator nie optymalizuje.

0
somekind napisał(a):

Pod warunkiem, że takich operacji kompilator nie optymalizuje.

Większość współczesnych optymalizuje widziałem nawet optymalizacje 10x jako (x<<3)+(x<<2).
Owszem nie zamienię w kodzie 10
x na (x<<3)+(x<<2) bo z pierwszego spojrzenia nie każdy to zrozumie.
Ale czy warto mieć nadzieje na mądrość kompilatora kiedy trzeba obliczyć x/16 ?

Endrju napisał(a):

Takie triki są nieczytelne i nic nie wnoszą moim zdaniem

Jeżeli to są tylko tryki to może i nie warto. Ale w większości przepadków kiedy dzielimy lub mnożymy przez potęgę dwójki to ma to coś wspólnego z potęgą dwójki czyli z systemem binarnym - więc przesunięcia bitowe są jak najbardziej w porządku a nawet (w tych właśnie przypadkach) więcej mówią.
np: wolisz x*131072 czy x<<17 ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1