2011-09-18 16 views
5

OK, może to brzmieć jak dziwne pytanie, ale jest interesujące. Koduję dla iOS i powiedziano mi, że zawsze najlepiej rozmnażać niż dzielić wartości, ponieważ jest to szybsze.Czy podział jest wolniejszy niż pomnożenie?

Wiem, że te procesory w tych czasach prawdopodobnie sprawiają, że to nie problem, ale moja ciekawość zyskała na sile i zastanawiam się, czy ktoś mógłby rzucić trochę światła na to dla mnie.

SO ..... Moje pytanie jest takie -
jest:

player.position = ccp(player.contentSize.width/2, winSize.height/2); 

wolniej niż:

player.position = ccp(player.contentSize.width * 0.5, winSize.height * 0.5); 
+1

Te rzeczy nie są takie same, chyba że 'player.contentSize.width' i' winSize.height' są liczbami zmiennoprzecinkowymi. – icktoofay

+1

Jeśli 'player.contentSize.width' i' winSize.height' są liczbami całkowitymi, to co powiesz na bitową zmianę prędkości? –

+2

Ponieważ ten kod prawie na pewno nie jest w pętli krytycznej pod względem wydajności, prawie na pewno nie ma znaczenia, czy dzielisz, czy mnożysz. Skoncentruj się na pisaniu jasnego, zwięzłego i niezawodnego kodu i martw się o wydajność tylko wtedy, gdy naprawdę potrzebujesz. –

Odpowiedz

4

W przypadku większości procesorów podział jest wolniejszy niż mnożenie dla tych samych typów danych:. W twoim przykładzie mnożenie jest operacją zmiennoprzecinkową, jeśli typy są liczbami całkowitymi, wynik może być bardzo różny i może zależeć zarówno od procesora, jak i kompilatora.

Jednak większość kompilatorów (na pewno GCC) przetłumaczy podział na stałą siłę-dwóch, jak w twoim przykładzie, na przesunięcie w prawo, gdzie byłoby to bardziej wydajne. Zasadniczo byłoby to szybsze niż mnożenie lub dzielenie.

7

Tak, podział jest zwykle znacznie wolniej niż mnożenia.

Jednak przy podziale na literały (lub cokolwiek, co można określić jako stałą w czasie kompilacji), kompilator zwykle optymalizuje podział.

+1

Przez "literały w ten sposób", ma on na myśli potęgę 2. Potem się zmienia. – UncleO

+1

Kompilator może również zoptymalizować dzielenie o 3, 5 i inne małe liczby. Jeśli tryb zmiennoprzecinkowy jest rozluźniony, podział FP zostanie zastąpiony mnożeniem przez odwrotność. – Mysticial

0

Mnożenie do pewnego stopnia można wykonać równolegle, jeśli można użyć mnożenia.

Powiązane problemy