2013-08-12 9 views
5

Supponendo che si desideri un elenco di matrici, ognuna delle stesse dimensioni. E 'meglio prestazioni-saggio usare una matrice 2D:Utilizzo di array 2d vs matrice di tipo derivato in Fortran 90

integer, allocatable :: data(:,:) 

o un array di tipi derivati:

type test 
    integer, allocatable :: content(:) 
end type 
type(test), allocatable :: data(:) 

Naturalmente, per gli array di diverse dimensioni, non abbiamo una scelta. Ma come viene gestita la memoria tra i 2 casi? Inoltre, è una di queste buone pratiche di codice?

risposta

4

In generale, si desidera utilizzare la struttura dati più semplice adatta al problema. Se una matrice rettangolare 2d soddisfa le tue esigenze e per un numero enorme di problemi di calcolo scientifico, i problemi per i quali Fortran è una buona scelta, allora questa è la scelta che desideri.

L'array 2d sarà contiguo in memoria, il che normalmente renderà più rapido l'accesso sia a causa della memorizzazione nella cache che di un livello inferiore di riferimento indiretto; l'array 2d ti permetterà anche di fare cose come data = data * 2 o data = 0. che l'approccio dell'array-of-array non è [Modificato da aggiungere: anche se come IanH indica nei commenti, puoi creare un tipo definito e operazioni definite su quei tipi per consentire ciò]. Questi vantaggi sono abbastanza grandi che anche quando si dispone di "array frammentati", se l'intervallo delle lunghezze di riga previste non è così grande, l'implementazione come array 2d rettangolare è a volte una scelta da prendere in considerazione.

+2

Considerare le funzionalità offerte dalle operazioni definite rispetto al commento sulla moltiplicazione e l'assegnazione agli array. – IanH

+0

Abbastanza corretto, ma rimane vero che l'uso di array 2D incorporati ti dà quelli (a) più veloci (b) con probabilmente meno temporanei (es. D = a * b + c), (c) con affettatura in entrambe le dimensioni al stessa ora, tutto (d) gratuitamente. Avrà ancora più senso fare array di array in alcuni casi, ma se non hai bisogno di quella generalità in più, usare il caso più semplice probabilmente ha senso. –

9

Scegliere l'attuazione, che riduce al minimo la distanza concettuale che la vostra mente ha a saltare tra il problema nella tua testa e la soluzione nel codice. La forza di questo approccio aumenta con l'età, sia l'età del tuo codice (una buona progettazione concettuale è una solida base per lo sviluppo futuro) sia la tua età (meno sforzo comprendi il tuo codice richiede più a lungo rimarrai mentalmente competente abbastanza da capire esso).

Per quanto riguarda la parte non definita dall'opinione pubblica della domanda relativa al modo in cui viene gestita la memoria ... La mia ingenua aspettativa è che la maggior parte dei compilatori, nella maggior parte dei casi, allocherà memoria contigua per il primo dei contorni, e non può per il secondo. Ma non mi interessa abbastanza di questo per controllare, e non penso che dovresti neanche. Non voglio, quindi, suggerire che non dovresti essere interessato a ciò che sta succedendo sotto il cofano, ma piuttosto che dovresti essere più interessato alle questioni di cui al primo paragrafo.

+1

+1: più ci penso, "minimizzare la distanza concettuale" è probabilmente più importante di una misura astratta di "più semplice". –

+0

è proprio così! devi trovare un equilibrio tra leggibilità e prestazioni ... – Girardi