LittleBuster
@LittleBuster

Gcc -Os или -O3?

Везде пишут -O3 даёт оптимизацию на ускорение работы программы, а -Os на уменьшение её размера. Я одного не пойму, разве уменьшение размера т.е. количества ассемблерных команд не должна ещё больше ускорять программу? Например на синтетическом тесте установмл, что -O3 У с++ программы не меняет размер, а -Оs сокращает со 160 строк до 70. Разве не должна программа от этого работать быстрее? Но везде у софта мы видим -O2 и -O3.
  • Вопрос задан
  • 612 просмотров
Решения вопроса 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Нет, размер и скорость - противоположные оптимизации.

Уменьшить размер программы можно, путем устранения inline-вызовов, что приведет к тормозам.

Другой пример: ускорить программу можно, заменив циклы на линейные наборы инструкций (loop-unroll (его и включает -O3)), что опять же увеличит размер бинарника.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@encyclopedist
Нет, это не так. Это было бы так, если бы команды выполнялись бы линейно и занимали бы одинаковое время, но у нас есть циклы и функции, а также не все команды занимают одинаковое время.

Есть важные оптимизации, которые сильно увеличивают размер программ, но в тоже время уменьшают время выполнения. Это:
- инлайнинг функций, когда код функции вставляется в место вызова. При это тело функции получается продублированным несколько раз в разных местах, но экономится время на вызовы (команды перехода, упаковка-распаковка аргументов)
- анроллинг циклов. Вместо того чтобы выполнять цикл по одному элементу 1000 раз, быстрее продублировать тело цикла например 4 раза и выполнить получившийся цикл 250 раз. Время экономится за счёт уменьшения количества условных переходов.
- векторизавция
- и некоторые другие
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы