Каково различие между gcc уровнями оптимизации?

Вы можете сделать это с помощью одной команды ffmpeg.

Пример

ffmpeg -i alone_in_the_wilderness.mp4 -filter_complex \
"select='isnan(prev_selected_t)+gte(t-prev_selected_t\,10)',yadif,scale=240:-1,tile=1x3" \
-vframes 1 -t 30 -q:v 4 strip.jpg

Пример с границами

tile=1x3:margin=10:padding=10

Также см.

24
задан Nathan Fellman 18 September 2008 в 05:21
поделиться

4 ответа

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

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

Как заключительное примечание, проект GNU компилирует все их программы в -O2 значением по умолчанию , и-O2 довольно распространен в другом месте.

14
ответ дан Martin W 29 November 2019 в 00:01
поделиться

Обычно уровни оптимизации выше, чем -O2 (всего -O3 для gcc, но других компиляторов имеют более высокие) включают оптимизацию, которая может увеличить размер Вашего кода. Это включает вещи как развертывание цикла, большое встраивание, дополнение для выравнивания независимо от размера, и т.д. Другие компиляторы предлагают векторизацию и межпроцедурную оптимизацию на уровнях выше, чем -O3, а также определенную оптимизацию, которая может улучшить скорость много за счет правильности (например, с помощью более быстрых, менее точных математических подпрограмм). Проверьте документы перед использованием этих вещей.

Что касается производительности, это - компромисс. В целом разработчики компилятора пытаются настроить эти вещи так, чтобы они не уменьшали производительность Вашего кода, таким образом -O3 будет обычно помогать (по крайней мере, по моему опыту), но Ваш пробег может варьироваться. Не всегда имеет место, что действительно агрессивная изменяющая размер оптимизация улучшит производительность (например, действительно агрессивное встраивание может получить Вас загрязнение кэша).

13
ответ дан Skynet 29 November 2019 в 00:01
поделиться

Я нашел веб-страница содержащий некоторую информацию о различных уровнях оптимизации. Одна вещь, которая помнить слушание где-нибудь - то, что оптимизация могла бы на самом деле повредить Вашу программу и это может быть проблемой. Но я не уверен, сколько из проблема, которая является больше. Возможно, сегодняшние компиляторы достаточно умны для решения тех проблем.

3
ответ дан Jonas 29 November 2019 в 00:01
поделиться

Заметка на полях:

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

Вот простой способ проверить точно, что происходит на Вашей конкретной установке, когда Вы используете один из -O флаги и другой -f флаги и/или комбинации этого:

  1. Создают пустой исходный файл где-нибудь:
    touch dummy.c
  2. Выполнение она, хотя передача компилятора так же, как Вы обычно были бы, со всем -O, -f и/или -m флаги, Вы будете обычно использовать, но добавление -Q -v к командной строке:
    gcc -c -Q -v dummy.c
  3. Осматривают сгенерированный вывод, возможно, сохраняя его для различного выполнения.
  4. Изменение командная строка к Вашей симпатии, удалите сгенерированный объектный файл через rm -f dummy.o и повторно выполнитесь.

кроме того, всегда имейте в виду, что с пуристской точки зрения большая часть нетривиальной оптимизации генерирует "поврежденный" код (где повреждено определяется как отклоняющийся от оптимального пути в угловых случаях), таким образом выбирая, разрешить ли определенный набор механизмов оптимизации, иногда сводится к выбору уровня правильности для выхода компилятора. Там всегда имеют (и в настоящее время), ошибки в оптимизаторе любого компилятора - просто проверяют список рассылки GCC и Bugzilla для некоторых образцов. Компиляторная оптимизация должна только использоваться после на самом деле работающих измерений с тех пор

  • усиления от использования лучшего алгоритма затмят любые усиления от компиляторной оптимизации,
  • нет никакого смысла в оптимизации кода, который выполнит каждый очень редко,
  • , если оптимизатор представит ошибки, это является несущественным, как быстро Ваш код работает.
1
ответ дан Mihai Limbășan 29 November 2019 в 00:01
поделиться