Wpis z mikrobloga

#programowanie #programista15k #jezykc Które rozwiązanie jest wg Was wydajniesze? nr 1 czy 2? kiedyś słyszałem że % modulo jest bardziej obciążające niż dzielenie.

kod przełączający pomiędzy 0,1,2

wersja 1:

int curr = 0;
curr++;
if (curr > 2) curr = 0;

link: https://franke.ms/cex/z/qanYd7

wersja 2:

int curr = 0;
curr = (curr + 1) % 3;

link: https://franke.ms/cex/z/rM4q7n
  • 17
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

kiedyś słyszałem że % modulo jest bardziej obciążające niż dzielenie.


@ZawzietyRobaczek: zwykle w procesorze modulo i dzielenie jest jednym działaniem, w jednym rejestrze ląduje wynik z dzielenia, a w drugim reszta z dzielenia(czyli modulo)
  • Odpowiedz
@ZawzietyRobaczek: zadanie szukanie wyniku reszty z dzielenia jest tak samo złożone, jak dzielenie, a dzielenie to jedna z najdroższych operacji w CPU.

Ten wysryw z assemblera ukrywa instrukcję procesora pod postacią calla do funkcji:

jsr
  • Odpowiedz
@ZawzietyRobaczek: no to idąc dalej i czerpiąc od @Saly, to tutaj masz maks, co możesz wycisnąć z kompilatora z optymalziacją:
https://franke.ms/cex/z/s1nbhh

Zwróć uwagę, że te funkcje są tak napisane, aby składniki wejściowe i wyjściowe musiały być czymś, co zostanie policzone w czasie wykonywania się programu, aby zostać wykorzystanymi przez potencjalny kod bloku wywołującego te funkcje.

W każdym razie Amiga, czy nie, to matematyka i przestrzeń w ramach logiki układów cyfrowych powodują,
  • Odpowiedz
Przykład http://franke.ms/cex/z/3c8KaT

@ZawzietyRobaczek: strasznie mało wydajny kod produkuje ten toolchain w sekcji "Amiga" - szczególnie robiąc te wywołania do jakiejś biblioteki, która ma zdefiniowany algorytm dzielenia i modulo.

Te ELF-y produkują lepszy kod.

Czy to dlatego, że mamy różne targety kodu dla Amigi? Że jakiś starszy target miał CPU bez operacji dzielenia? Czy może to jest kwestia hobbystycznego kompilatora, a drugi to jest ten
  • Odpowiedz