Злоупотребление вызовов функции влияет на производительность? Конкретно в Фортране

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

Я знаю в Java/Python и т.д., каждая функция является объектом, и так создание большого количества функций потребовало бы, чтобы они были созданы в памяти. Я также знаю, что в Haskell функции уменьшаются друг в друга, таким образом, это имеет мало значения там.

Кто-либо знает о случае с Фортраном? Существует ли различие с использованием поглощенных/чистых функций/объявления меньше локальных переменных/чего-либо еще?

5
задан Samizdis 9 July 2010 в 16:32
поделиться

4 ответа

Вызовы функций несут затраты на производительность для языков, основанных на стеке, таких как Fortran. Они должны добавляться к стеку и т.д.

Из-за этого большинство компиляторов стараются активно инкрустировать вызовы функций, если это возможно. В большинстве случаев компилятор делает правильный выбор, инкрустировать или нет определенные функции в вашей программе.

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

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

9
ответ дан 18 December 2019 в 16:35
поделиться

Просто напишите код самым простым и хорошо структурированным способом, который вы можете, затем, когда он будет написан и протестирован, вы можете профилировать его, чтобы увидеть, есть ли "горячие точки", требующие оптимизации. Только в этот момент вы должны беспокоиться о микрооптимизации, и это может даже не понадобиться, если ваш компилятор делает свою работу.

2
ответ дан 18 December 2019 в 16:35
поделиться

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

Это не функция языка, и не совсем функция инлайнинга. Вызовы функций могут быть свободными, и у вас все равно останется проблема, что дерево вызовов имеет тенденцию быть более кустистым, чем нужно. Вам нужно найти, где его подрезать. Это метод "профилирования", на который я полагаюсь.

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

1
ответ дан 18 December 2019 в 16:35
поделиться

Обычно вызовы подпрограмм / функций в Фортране имеют очень небольшие накладные расходы. Хотя в стандарте языка не указаны механизмы передачи аргументов, типичная реализация осуществляется «по ссылке», поэтому не требуется никакого копирования, а только настройка новой процедуры. На большинстве современных архитектур это не требует больших затрат. Выбор хороших алгоритмов обычно гораздо важнее микрооптимизации.

Исключением для быстрого вызова может быть случай, когда компилятор должен создать временные массивы, например, если фактический аргумент является несмежным подразделом массива, а аргумент вызываемой процедуры является простым непрерывным массивом. Предположим, что фиктивный аргумент - размерность (:). Вызвать его с массивом размерности (:) просто. Если вы запрашиваете неединичный шаг в вызове, например, array (1: 12: 3), тогда массив не является непрерывным, и компилятору может потребоваться создать временную копию. Предположим, что фактический аргумент - размер (:, :). Если в вызове есть array (:, j), подмассив является непрерывным, поскольку в Фортране первый индекс изменяется быстрее всего в памяти и не требует копирования.Но array (i, :) не является непрерывным и может потребовать временной копии.

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

0
ответ дан 18 December 2019 в 16:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: