Подтвердить что ты не робот

Производительность скомпилированного кода скомпилированным компилятором

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

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

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

Ответ 5

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

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