Dzielenie vs mnożenie - wydajność

Odpowiedz Nowy wątek
2014-12-15 17:41
Mały Samiec
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?

jak jest jakaś prosta optymalizacja, to jest szansa, że kompilator robi już ją za ciebie. sprawdź kod asemblera :) - Wizzie 2014-12-15 17:59

Pozostało 580 znaków

2014-12-15 17:47
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit, 2014-12-15 17:49

Pozostało 580 znaków

2014-12-15 18:14
Mały Samiec
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.

Pozostało 580 znaków

2014-12-15 18:17
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2014-12-15 18:18

Pozostało 580 znaków

2014-12-15 18:23
Mały Samiec
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?

Pozostało 580 znaków

2014-12-15 19:13
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 3x, ostatnio: Wibowit, 2014-12-15 19:16

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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