Насколько быстрее «C ++» код должен быть с включенными оптимизациями? - PullRequest
2 голосов
/ 31 марта 2020

У меня есть программа, которая запускается примерно за 1 минуту при компиляции с g ++ без каких-либо опций. Однако компиляция с -O3 запускает его примерно за 1-2 секунды.

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

1 Ответ

3 голосов
/ 31 марта 2020

Насколько быстрее «предполагается» код C ++ с включенными оптимизациями?

Теоретически: разницы в скорости не обязательно должно быть. Не существует и никакого верхнего предела разницы в скорости. Язык C ++ просто не определяет разницу между оптимизацией и ее отсутствием.

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

... 1 минута ... [оптимизация] заставляет ее работать примерно за 1-2 секунд.

Мой вопрос: нормально ли так много ускоряться?

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

Или мой код, возможно, настолько плох, что оптимизация может отнять столько времени.

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

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

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

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

... или должно ...

Нет. Нет причин тратить время на то, что компилятор уже сделал для вас.


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

...