Dzielenie vs mnożenie - wydajność

0

Hey, chciałem się zapytać co powinno się szybciej wykonać np. w C++ lub czymś podobnym:
a) dzielenie dwóch liczb całkowitych czy
b) mnożenie liczby całkowitej przez liczbę rzeczywistą (float)

Chodzi o to, że jak mamy pętlę i jest wielokrotne dzielenie dwóch liczb całkowitych to można przed pętlą zrobić float tmp_var = 1/liczba_calkowita; a następnie mnożyć taką liczbę zamiast dzielić ;-).
Ale zastanawiam się, czy liczby całkowite nie dzielą się jakoś szybciej niż rzeczywiste?

0

Hey, chciałem się zapytać co powinno się szybciej wykonać np. w C++ lub czymś podobnym:
a) dzielenie dwóch liczb całkowitych czy
b) mnożenie liczby całkowitej przez liczbę rzeczywistą (float)

Mnożenie będzie szybsze. Nawet mimo tego, że wymaga konwersji typów (a ta nie jest darmowa), bo procesory zwykle nie mają instrukcji, które przyjmują argumenty różnych typów.

Możesz też skorzystać z asmlib: http://agner.org/optimize/#asmlib
Jest tam funkcja która implementuje coś podobnego co ty chcesz zrobić, tyle że zastępuje dzielenie całkowite mnożeniem całkowitym + paroma tanimi obliczeniowo trikami. W przeciwieństwie do zabawy z floatami jest dokładna, czyli zawsze da taki wynik jaki dałoby dzielenie całkowite. Wyznaczenie mnożnika i poprawek zajmuje więcej niż pojedyncze dzielenie, więc zabawa w to jest opłacalna tylko gdy dzielisz wielokrotnie przez tę samą liczbę bez ponownego obliczania mnożnika.

0

@Wibowit dzięki za wyjaśnienie ;-).
Ogólnie to zakładam właśnie, że będzie wielokrotne dzielenie przez ten sam mianownik więc chyba lepiej zostać przy tym floacie.

0

Aaa, jeszcze nawiązując do komentarza @Wizzie:
Dzielenie przez stałą kompilator jest w stanie zamienić na mnożenie na etapie kompilacji wraz z liczeniem mnożnika, a więc zostaje samo mnożenie bez narzutu. Tylko ze zmiennymi ręczna zabawa w eliminowanie dzieleń ma sens.

0
Wibowit napisał(a):

Dzielenie przez stałą kompilator jest w stanie zamienić na mnożenie na etapie kompilacji wraz z liczeniem mnożnika, a więc zostaje samo mnożenie bez narzutu. Tylko ze zmiennymi ręczna zabawa w eliminowanie dzieleń ma sens.

No właśnie dzielę przez zmienną przekazywaną przez argument funkcji (chociaż jej nie zmieniam w jej ciele). Czy przedrostek const sprawi, że ona "stanie" się stałą i kompilator sobie z nią sam poradzi?

0

Nie. Chodziło mi o stałą znaną w czasie kompilacji, bo dzięki temu może on obliczyć mnożnik w czasie kompilacji i wstawić go bezpośrednio do kodu. Chociaż z drugiej strony, gdyby kompilator był wystarczająco sprytny, to by sobie sam wyliczył mnożniki itd poza pętlą, a w pętli zamienił dzielenie na mnożenie. Ale na to raczej ciężko liczyć, bo kompilatorowi ciężko wyliczyć czy takie zabawy się opłacą. Co jeśli typowo pętla obraca się nie więcej niż raz? Wtedy zabawa przynosiłaby spadek wydajności.

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