2013-08-12 2 views
5

Предполагая, что вам нужен список массивов, каждый из которых имеет одинаковый размер. Это лучше производительность разумно использовать 2D массив:Использование 2d массива против массива производного типа в Fortran 90

integer, allocatable :: data(:,:) 

или массив производных типов:

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

Конечно, для массивов различных размеров, у нас нет выбора. Но как память управляется между двумя случаями? Кроме того, является ли одна из них хорошей практикой кода?

ответ

4

В общем, вы хотите использовать простейшую структуру данных, которая подходит для вашей проблемы. Если 2d прямоугольный массив отвечает вашим потребностям - и для огромного количества проблем с научными вычислениями, проблемы, для которых Fortran - хороший выбор, он делает - тогда это выбор, который вы хотите.

2-й массив будет смежным в памяти, что, как правило, ускорит его доступ как из-за кеширования, так и с меньшим уровнем косвенности; 2d-массив также позволит вам делать такие вещи, как data = data * 2 или data = 0., которые не подходят для массива-массива [Отредактировано для добавления: хотя, как указывает IanH в комментариях, вы можете создать определенный тип и определенные операции над этими типами для этого]. Эти преимущества достаточно велики, что даже если у вас есть «оборванные массивы», если диапазон ожидаемых длин строк не такой большой, реализация его как прямоугольного массива 2d иногда является выбором.

+2

Рассмотрите возможности, предлагаемые определенными операциями в отношении вашего комментария о умножении и присваивании массивам. – IanH

+0

Достаточно справедливо, но верно, что с использованием встроенных в 2d массивов вы получаете те (a) быстрее (b) с вероятностью меньшего количества временных (например, d = a * b + c), (c) с нарезкой в ​​обоих измерениях на в то же время, все (d) бесплатно. По-прежнему будет иметь смысл делать массивы массивов в некоторых случаях, но если вам не нужна эта дополнительная общность, использование более простого случая, вероятно, имеет смысл. –

9

Выберите реализацию, которая сводит к минимуму концептуального расстояния, что ваш уму должен прыгать между проблемой в голове и решения в коде. Сила этого подхода возрастает с возрастом, как с возрастом вашего кода (хороший концептуальный дизайн является прочной основой для будущего развития), так и для вашего собственного возраста (чем меньше усилий, чем ваш код требует, тем дольше вы останетесь умственно компетентным, чтобы понимать Это).

Что касается части вашего вопроса о том, как управляется память, мое мнение состоит в том, что большинство компиляторов в большинстве случаев выделяют непрерывную память для первого из ваших контуров, и не может быть второй. Но мне все равно, чтобы это проверить, и я не думаю, что вам тоже нужно. Я не утверждаю, что вы не должны быть заинтересованы в том, что происходит под капотом, а скорее о том, что вас больше интересуют вопросы, упомянутые в первом абзаце.

+1

+1 - чем больше я думаю об этом, «минимизация концептуального расстояния», вероятно, более важна, чем какая-то абстрактная мера «простейшего». –

+0

вот как раз! вам нужно найти баланс между читабельностью и производительностью ... – Girardi

Смежные вопросы