Как вы обычно настраиваете параметры оптимизации вашего компилятора?

StackOverflow https://stackoverflow.com/questions/53811

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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)

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top