Avatar billede esbenp Nybegynder
17. maj 2006 - 23:57 Der er 8 kommentarer og
1 løsning

performance af to dimensionelt array vs liniært array

Jeg tænkte over hvad grunden til at multi dimensionelle arrays i java er implementeret som arrays af referencer til arrays når man kan fake multidimensionelle arrays med et en-dimensionelt array som eksempelvis med oneArray[i*n+j] som er ækvivalent med twoArray[i][j]. Er der nogle fordele mht cache når man har med mange små arrays at gøre frem for et stort.

/Esben
Avatar billede arne_v Ekspert
18. maj 2006 - 00:24 #1
en forskel er ihvertfald at med array af arrays så behøver alle under arrays
ikke at have samme længde
Avatar billede arne_v Ekspert
18. maj 2006 - 00:26 #2
begrundelsen er vel at man i praksis (bortset fra numeriske kalkulationer) oftest
har brug for dobbelt dynamikken: først allokerer man referencer til et antal arrays
og så allokerer man de enkelte arrays
Avatar billede arne_v Ekspert
18. maj 2006 - 00:27 #3
C++ har rigtige 2D arrays
Java har array af arrays
C# har begge muligheder

nogen træffer et valg og så hænger man på det
Avatar billede esbenp Nybegynder
18. maj 2006 - 10:14 #4
Hvordan er rigtigt 2d arrays så implementeret i c++? Er det bare et liniært array med passende længde?

/Esben
Avatar billede arne_v Ekspert
18. maj 2006 - 13:27 #5
ja rigtige 2D arrays er kontinuerligt memory hvor compileren omregner
fra 2 index til et offset (som er det tilsvarende 1D index evt.
ganget med størrelsen af typen)
Avatar billede esbenp Nybegynder
18. maj 2006 - 14:45 #6
Ok. Jeg har testet lidt i java og det ser ud til at arrays af arrays er ca 10% hurtigere end et kontinuerligt array hvor man omregner index.

Jeg forstår ikke helt det dynamiske argument. Bliver man ikke altid nødt til at allokere som new int[n][m]. Dvs allokere m+1 arrays på en gang. Er det muligt først at allokere et array og derefter fylde det array op med arrays som der er behov for det?
Avatar billede arne_v Ekspert
18. maj 2006 - 15:36 #7
eksempel:

package may;

public class TwoDimArrays {
    public static void main(String[] args) {
        int[][] a1 = new int[3][3];
        for(int i = 0; i < a1.length; i++) {
            for(int j = 0; j < a1[i].length; j++) {
                System.out.print(" " + a1[i][j]);
            }
            System.out.println();
        }
        int[][] a2 = new int[3][];
        a2[0] = new int[1];
        a2[1] = new int[2];
        a2[2] = new int[3];
        for(int i = 0; i < a2.length; i++) {
            for(int j = 0; j < a2[i].length; j++) {
                System.out.print(" " + a2[i][j]);
            }
            System.out.println();
        }
    }
}
Avatar billede esbenp Nybegynder
18. maj 2006 - 17:52 #8
ok nu er jeg med. Smid et svar arne
Avatar billede arne_v Ekspert
18. maj 2006 - 19:56 #9
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester