Как вы обычно настраиваете параметры оптимизации вашего компилятора? - PullRequest
6 голосов
/ 10 сентября 2008

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

Я заметил, что большую часть времени люди склонны просто оставлять настройки оптимизации компилятора в их состоянии по умолчанию, что в Visual C ++ означает максимальную скорость. Я всегда чувствовал, что настройки по умолчанию больше связаны с тем, чтобы хорошо выглядеть на тестах, которые, как правило, представляют собой небольшие программы, которые полностью помещаются в кэш L2, чем те, которые лучше всего подходят для общей производительности, поэтому я обычно настраиваю его на минимальный размер.

Ответы [ 11 ]

6 голосов
/ 10 сентября 2008

Как пользователь Gentoo, я пробовал довольно много оптимизаций на полной ОС, и на форумах Gentoo велись бесконечные дискуссии об этом. Некоторые хорошие флаги для GCC можно найти в wiki .

Короче говоря, оптимизация по размеру лучше всего работала на старом ноутбуке Pentium3 с ограниченным количеством оперативной памяти, но на моем главном настольном компьютере с Core2Duo -O2 давал лучшие результаты по всем параметрам.

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

Если вы используете gcc и действительно хотите оптимизировать конкретное приложение, попробуйте ACOVEA . Он запускает набор тестов, а затем перекомпилирует их со всеми возможными комбинациями флагов компиляции. На сайте есть пример использования кодировки Хаффмана (чем ниже, тем лучше):

A relative graph of fitnesses:

   Acovea Best-of-the-Best: **************************************                (2.55366)
     Acovea Common Options: *******************************************           (2.86788)
                       -O1: **********************************************        (3.0752)
                       -O2: ***********************************************       (3.12343)
                       -O3: ***********************************************       (3.1277)
           -O3 -ffast-math: **************************************************    (3.31539)
                       -Os: *************************************************     (3.30573)

(Обратите внимание, что он оказался самым медленным в этой системе Opteron.)

2 голосов
/ 10 сентября 2008

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

Я верю, что этот метод доступен публично в VS, но я не уверен на 100%.

2 голосов
/ 10 сентября 2008

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

1 голос
/ 15 сентября 2008

Создайте оба профиля, выберите профиль, который лучше работает на конкретном проекте и оборудовании.

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

1 голос
/ 11 сентября 2008

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

1 голос
/ 10 сентября 2008

Microsoft поставляет все свое программное обеспечение C / C ++, оптимизированное по размеру. После бенчмаркинга они обнаружили, что он на самом деле дает лучшую скорость (из-за локальности кэша).

1 голос
/ 10 сентября 2008

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

Я использую GCC и, как правило, оставляю его на «-O2», который является «самым безопасным» уровнем оптимизации и предпочитает скорость по сравнению с минимальным размером.

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

0 голосов
/ 26 октября 2008

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

0 голосов
/ 15 сентября 2008

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

0 голосов
/ 10 сентября 2008

Память дешевая в наши дни :) Так что может иметь смысл установить максимальную скорость для параметров компилятора, если вы не работаете со встроенными системами. Конечно, ответ зависит от конкретной ситуации.

...