Array ihmetystä

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?
4509
Äänestä

Muut lukivat myös

Vastaukset 4

Vanhimmat

Riippuu mitä teet tuolla taulukolla. Silmukoissa noiden kahden version välillä tapahtuu se ero, taulukon tietomäärä pysyy vakiona.

Äänestä

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ä).

Äänestä

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.

Äänestä
  • Juuri tuota muistelin ja yritinkin hahmotella replyksi mutta... Hyvä että joku löysi linkin :)

    Äänestä

Kommentoi aloitusta


Iyrgra kirjoitti:

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?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu