Aikasemmin oli C koodissa näin, tuttu neuvoi vaihtamaan
bool testi[4000][50];
tämmöiseksi
bool testi[50][4000];
Ja tietenkin muutin loopit jne... vastaamaan tuota. Niin hämmästys oli suuri kun ohjelman suoritus nopeutuikin noin kolmasosaan siitä mitä se ennen oli.
Joten kysymys miksi näin?
Eikös nuo ole sama asia?
bool testi[4000][50];
tämmöiseksi
bool testi[50][4000];
Ja tietenkin muutin loopit jne... vastaamaan tuota. Niin hämmästys oli suuri kun ohjelman suoritus nopeutuikin noin kolmasosaan siitä mitä se ennen oli.
Joten kysymys miksi näin?
Eikös nuo ole sama asia?
Vastaukset 4
Vanhimmat
Riippuu mitä teet tuolla taulukolla. Silmukoissa noiden kahden version välillä tapahtuu se ero, taulukon tietomäärä pysyy vakiona.
monihan tekee sen "virheen" että jos taulukoilla kuvataan matriisia (esim. 2d-avaruus) niin sekoittaa sarakkeet ja rivit keskenään. oikein määriteltynähän se menee niin että
int yksi_ulotteinen_taulukko[x];
int kaksi_ulotteinen_taulukko[y][x];
int kolme_ulotteinen_taulukko[z][y][x];
...
eikä päinvastaisessa järjestyksessä kuten moni aloittelija tekee. eihän se tietenkään mikään virhe ole, koska molempi tapa toimii, mutta tiedon käsittelyn kannalta tuo "oikea" tapa on nopeampi, koska siinä alkiot sijaitsee ikään kuin lineaarisesti muistissa ja näin peräkkäisten alkoiden hakeminen (mikä on tavallista) käy paljon nopeammin (ei turhia kertolaskuja vaan lisätään vain osoitinta yhdellä).
Se tuttu nimittäin miksi tuo kannattaa muuttaa?
>Eikös nuo ole sama asia?
Ei ole.
Vaikka sinulla on moniulotteinen taulukko niin koneen muisti on aina yksiulotteinen eli taulukon alkiot ovat aina peräkkäin muistissa ja viittaukset niihin tehdään pointterilla. Sinun tapauksessa, riippuen kumpaa indexiä muutat yhdellä, hyppy on joko 1 tai 4000 byteä.
http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html
Suoritusnopeuden kannalta on kriittistä löytyykö viittauksen kohde cachesta vai ei.
Juuri tuota muistelin ja yritinkin hahmotella replyksi mutta... Hyvä että joku löysi linkin :)