Практика кодирования, которая позволяет компилятору / оптимизатору создавать более быструю программу - PullRequest
116 голосов
/ 15 января 2010

Много лет назад компиляторы C не были особенно умными. В качестве обходного пути K & R изобрел ключевое слово register , чтобы намекнуть компилятору, что, возможно, было бы неплохо сохранить эту переменную во внутреннем регистре. Они также сделали третичный оператор, чтобы помочь генерировать лучший код.

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

FORTRAN может быть быстрее, чем C, для некоторых видов операций из-за проблем alias . В теории с осторожным кодированием можно обойти это ограничение, чтобы оптимизатор мог генерировать более быстрый код.

Какие существуют методы кодирования, которые могут позволить компилятору / оптимизатору генерировать более быстрый код?

  • Буду признателен за указание используемой вами платформы и компилятора.
  • Почему техника работает?
  • Пример кода приветствуется.

Вот связанный вопрос

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

[Изменить] Ссылка, связанная со смещением

Ответы [ 32 ]

0 голосов
/ 15 января 2010

Пусть оптимизатор сделает свою работу.

Серьезно. Не пытайтесь перехитрить оптимизатор. Он был разработан блестящими людьми с гораздо большим опытом, чем вы.

0 голосов
/ 17 января 2010

Одна вещь, которую я смутно помню из Cobol в 80-х годах, заключалась в том, что были опции компоновщика, которые позволяли вам изменять порядок, в котором функции были связаны друг с другом.Это позволило вам (возможно) увеличить локальность кода.

По той же идее.Если бы вас интересовало, возможна ли возможная оптимизация с использованием шаблона

for (some silly loop)
if (something)
    if (somthing else)
        if (somthing else)
            if (somthing else)
                /* This is the normal expected case */ 
            else error 4
        else error 3
    else error 2
else error 1

, то for head и ifs могут помещаться в блок кэша, что в теории может привести к более быстрому выполнению цикла.

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

Комментарии?Я сплю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...