2013-08-12 10 views
5

Zakładając, że chcesz mieć listę tablic, z których każda ma taki sam rozmiar. Czy lepiej wydajność mądry użyć 2D tablicy:Używanie tablicy 2d względem tablicy typu pochodnego w Fortran 90

integer, allocatable :: data(:,:) 

lub tablicę typów pochodnych:

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

Oczywiście, dla tablic o różnych rozmiarach, nie mamy wyboru. Ale w jaki sposób pamięć jest zarządzana między 2 przypadkami? Czy jest to także jedna z dobrych praktyk kodowania?

Odpowiedz

4

Ogólnie rzecz biorąc, chcesz użyć najprostszej struktury danych, która pasuje do Twojego problemu. Jeśli tablica prostokątna 2d spełnia twoje potrzeby - i dla ogromnej liczby problemów z komputerami naukowymi, problemy, dla których Fortran jest dobrym wyborem, to robi - to jest twój wybór.

Tablica 2d będzie ciągła w pamięci, co normalnie przyspieszy dostęp zarówno ze względu na buforowanie, jak i jeden poziom pośredni; tablica 2d pozwoli ci również na takie operacje, jak data = data * 2 lub data = 0., dla której metoda tablicowa nie ma wartości [Edytowane w celu dodania: chociaż IANH wskazuje w komentarzach, że można utworzyć zdefiniowany typ i zdefiniowane operacje na tych typach na to pozwolić]. Te zalety są na tyle duże, że nawet jeśli masz "poszarpane tablice", jeśli zakres spodziewanych długości rzędu nie jest zbyt duży, implementacja go jako prostokątnej tablicy 2d jest czasami wyborem wartym rozważenia.

+2

Rozważ możliwości oferowane przez określone operacje w odniesieniu do komentarza dotyczącego mnożenia i przypisania do tablic. – IanH

+0

Wystarczająco uczciwe, ale prawdą jest, że używanie wbudowanych macierzy 2d powoduje, że (a) szybciej (b) z mniejszą liczbą tymczasowych (np. D = a * b + c), (c) z wycinaniem w obu wymiarach przy w tym samym czasie, wszystkie (d) za darmo. W niektórych przypadkach bardziej sensowne będzie robienie tablic-tablic, ale jeśli nie potrzebujesz dodatkowej ogólności, najprawdopodobniej zastosowanie prostszego przypadku. –

9

Wybierz realizację który minimalizuje odległość koncepcyjnego, że twój umysł musi skoczyć między problemu w głowie i rozwiązanie w kodzie. Siła tego podejścia wzrasta wraz z wiekiem, zarówno wiek twojego kodu (dobry projekt koncepcyjny jest solidnym fundamentem dla przyszłego rozwoju), jak i twój wiek (mniej wysiłku zrozumienia kodu wymaga dłuższego pozostania psychicznie wystarczająco kompetentnym, aby zrozumieć to).

Co do nieokreślonej części pytania dotyczącego sposobu zarządzania pamięcią ... Moim naiwnym oczekiwaniem jest to, że większość kompilatorów w większości przypadków przydzieli ciągłą pamięć dla pierwszego z twoich konturów, i może nie na drugi. Ale nie dbam o to, by to sprawdzić, i nie sądzę, że powinieneś. Nie sugeruję przez to, że nie powinniście być zainteresowani tym, co dzieje się pod maską, ale raczej powinniście bardziej zainteresować się sprawami, o których mowa w pierwszym akapicie.

+1

+1 - im więcej o tym myślę, "minimalizacja odległości koncepcyjnej" jest prawdopodobnie ważniejsza niż jakaś abstrakcyjna miara "najprostszej". –

+0

to jest dokładnie to! musisz znaleźć równowagę między czytelnością i wydajnością ... – Girardi