operacje matematyczne

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
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?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Tak się zastanawiałem co jest szybsze

Wszystko zostanie zoptymalizowane w czasie kompilacji :]

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
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.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
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;

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
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 ?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.