Производительность скомпилированного кода скомпилированным компилятором - PullRequest
13 голосов
/ 23 января 2012

Если я хочу добиться лучшей производительности, скажем, например, MySQLdb, я могу скомпилировать его сам, и я получу лучшую производительность, потому что он не скомпилирован на i386, i486 или чем-то еще, только на моем процессоре.Далее я могу выбрать параметры компиляции и так далее ... Теперь мне было интересно, верно ли это и для нестандартного программного обеспечения, такого как компилятор.А вот и первая часть:

  • Приведет ли компилятор, подобный GCC, к лучшей производительности?и вторая часть:
  • Будет ли код, скомпилированный моим собственным скомпилированным компилятором, работать лучше?

(Да, я знаю, я могу скомпилировать свой компилятор и протестировать его ... номожет быть ... кто-то уже знает ответ и поделится им с нами =)

Ответы [ 5 ]

14 голосов
/ 23 января 2012

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

Что касается вашего второго вопроса, нет.

Вывод компилятора будет одинаковым независимо от того, как вы его оптимизировали (если, конечно, он не глючит).

Другими словами, даже есливы полностью заполнили флаги компилятора при компиляции gcc, и к тому моменту, когда вашей конкретной скомпилированной версии gcc требуется полторы недели, чтобы скомпилировать «Hello World», фактический исполняемый файл «Hello World» должен быть идентиченодин произведен «наименьшим общим знаменателем» gcc (если вы используете те же флаги).

5 голосов
/ 23 января 2012

(1) Это возможно. Если вы вводите новую оптимизацию в свой компилятор и перекомпилируете ее с включенной оптимизацией - возможно, что перекомпилированный код будет работать лучше.

(2) Нет !!!! Компилятор не может изменить логику кода! В вашем случае логика кода - это нативный код, созданный в конце. Таким образом, если компилятор A_1 скомпилирован с использованием компилятора A_2 или B, не влияет на собственный код, созданный A_1 [здесь A_1, A_2 - те же компиляторы, индекс приведен только для ясности].

3 голосов
/ 23 января 2012

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

b.Нет. Даже если вы скомпилируете компилятор на своем компьютере, его поведение не должно измениться, и поэтому генерируемый им код также не изменится.

2 голосов
/ 23 января 2012

Приведет ли компилятор, подобный GCC, к повышению производительности?

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

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

С другой стороны, вы должны спросить себя, действительно ли такая программа, как GCC, является ЦПограничено (гораздо более вероятно, что оно будет связано с вводом-выводом), а настройка производительности процессора дает ощутимые преимущества

Будет ли код, скомпилированный моим собственным скомпилированным компилятором, работать лучше

Надеюсь, что нет!Разрешение компилятору оптимизировать программу никогда не должно изменять ее поведение.Независимо от того, как вы скомпилировали свой GCC, он должен компилировать код в те же двоичные файлы, что и общий двоичный дистрибутив GCC.

Если код, скомпилированный для конкретной платформы, быстрее, чем код, скомпилированный для общей платформы, почему бы нам всем не отправлять код вместо двоичных файлов?Угадайте, что некоторые дистрибутивы Linux на самом деле следуют этой философии, такие как Gentoo.И пока вы работаете над этим, обязательно создавайте статически связанные двоичные файлы, дисковое пространство в настоящее время настолько дешево и дает вам еще как минимум 0,001% производительности.

Хорошо, это было немного саркастично.Причина, по которой люди распространяют общие двоичные файлы, довольно очевидна: это geneirc, самый низкий общий знаменатель, и он будет работать везде.Это большой бонус с точки зрения гибкости и удобства для пользователя.Я помню, как однажды для сборки Gnome для моей коробки Gentoo это заняло день или два!(Но, должно быть, это было намного быстрее ;-))

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

0 голосов
/ 23 января 2012

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

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

...