Вы можете сделать это с помощью одной команды 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
Да, более высокий уровень может иногда означать лучшую программу выполнения. Однако это может вызвать проблемы в зависимости от Вашего кода. Например, предсказание ветвлений (включил в-O1 и) может повредить плохо записанные много программы поточной обработки путем порождения состояния состязания. Оптимизация на самом деле решит что-то, что это лучше, чем, что Вы записали, который в некоторых случаях не мог бы работать.
И иногда, более высокая оптимизация (-O3) не добавляет разумного преимущества, но большого дополнительного размера. Ваше собственное тестирование может определить, делает ли этот компромисс размера разумное увеличение производительности для Вашей системы.
Как заключительное примечание, проект GNU компилирует все их программы в -O2 значением по умолчанию , и-O2 довольно распространен в другом месте.
Обычно уровни оптимизации выше, чем -O2
(всего -O3
для gcc, но других компиляторов имеют более высокие) включают оптимизацию, которая может увеличить размер Вашего кода. Это включает вещи как развертывание цикла, большое встраивание, дополнение для выравнивания независимо от размера, и т.д. Другие компиляторы предлагают векторизацию и межпроцедурную оптимизацию на уровнях выше, чем -O3
, а также определенную оптимизацию, которая может улучшить скорость много за счет правильности (например, с помощью более быстрых, менее точных математических подпрограмм). Проверьте документы перед использованием этих вещей.
Что касается производительности, это - компромисс. В целом разработчики компилятора пытаются настроить эти вещи так, чтобы они не уменьшали производительность Вашего кода, таким образом -O3
будет обычно помогать (по крайней мере, по моему опыту), но Ваш пробег может варьироваться. Не всегда имеет место, что действительно агрессивная изменяющая размер оптимизация улучшит производительность (например, действительно агрессивное встраивание может получить Вас загрязнение кэша).
Я нашел веб-страница содержащий некоторую информацию о различных уровнях оптимизации. Одна вещь, которая помнить слушание где-нибудь - то, что оптимизация могла бы на самом деле повредить Вашу программу и это может быть проблемой. Но я не уверен, сколько из проблема, которая является больше. Возможно, сегодняшние компиляторы достаточно умны для решения тех проблем.
Заметка на полях:
довольно трудно предсказать точно, какие флаги включены глобальным -O
директивы по gcc командной строке для различных версий и платформ, и вся документация относительно сайта GCC, вероятно, станет устаревшей быстро или не касается внутренностей компилятора достаточно подробно.
Вот простой способ проверить точно, что происходит на Вашей конкретной установке, когда Вы используете один из -O
флаги и другой -f
флаги и/или комбинации этого:
touch dummy.c
-O
, -f
и/или -m
флаги, Вы будете обычно использовать, но добавление -Q -v
к командной строке: gcc -c -Q -v dummy.c
rm -f dummy.o
и повторно выполнитесь. кроме того, всегда имейте в виду, что с пуристской точки зрения большая часть нетривиальной оптимизации генерирует "поврежденный" код (где повреждено определяется как отклоняющийся от оптимального пути в угловых случаях), таким образом выбирая, разрешить ли определенный набор механизмов оптимизации, иногда сводится к выбору уровня правильности для выхода компилятора. Там всегда имеют (и в настоящее время), ошибки в оптимизаторе любого компилятора - просто проверяют список рассылки GCC и Bugzilla для некоторых образцов. Компиляторная оптимизация должна только использоваться после на самом деле работающих измерений с тех пор