Когда мне следует использовать опцию -pipe в GCC? - PullRequest
53 голосов
/ 03 октября 2009

В документации GCC 4.1.2 есть что сказать о опции -pipe:

-pipe

Используйте каналы, а не временные файлы для связи между различными этапами компиляции. Это не работает в некоторых системах, где ассемблер не может читать из канала; но у ассемблера GNU нет проблем.

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

Ответы [ 6 ]

36 голосов
/ 07 января 2010

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

35 голосов
/ 03 октября 2009

Обычно это не имеет значения

Он имеет + и - соображений. Исторически сложилось так, что одновременный запуск компилятора и ассемблера требовал использования ресурсов ОЗУ.

Gcc невелик по современным стандартам, а -pipe добавляет немного параллельного параллельного выполнения с несколькими ядрами.

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

Теперь есть несколько крупных проектов. Вы можете проверить одно дерево, которое будет собирать весь Firefox или NetBSD, или что-то в этом роде, что-то действительно большое. То, что включает в себя весь X, скажем, как второстепенный компонент подсистемы. Вы можете заметить или не заметить разницу, когда работа включает в себя миллионы строк кода в тысячах и тысячах C-файлов. Как я уверен, вы знаете, что люди обычно работают только над небольшой частью чего-то подобного одновременно. Но если вы являетесь инженером по выпуску или работаете на сервере сборки, или изменяете что-то в stdio.h, , вы вполне можете захотеть собрать всю систему, чтобы увидеть, не сломали ли вы что-нибудь. И теперь, вероятно, каждая капля производительности имеет значение ...

27 голосов
/ 25 мая 2010

Попытка сделать это сейчас, кажется, что сборка будет умеренно быстрее, когда в качестве источника / сборки используются NFS (сеть linux). Использование памяти высоко, хотя. Если вы никогда не заполняете ОЗУ и у вас есть источник в NFS, это похоже на победу с -pipe.

10 голосов
/ 03 октября 2009

Честно говоря, есть очень мало причин, чтобы не использовать его. -pipe будет использовать только чуть больше оперативной памяти, что, если этот блок строит код, я бы предположил, что имеет приличное количество. Это может значительно сократить время сборки, если ваша система использует более консервативную файловую систему, которая записывает, а затем удаляет все временные файлы по пути (например, ext3).

3 голосов
/ 28 марта 2012

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

Для файлов компилятору сначала нужно закончить запись, прежде чем он сможет вызвать ассемблер. Еще одним преимуществом каналов является то, что и компилятор, и ассемблер могут работать одновременно, и в нем все больше используется архитектура SMP. Особенно, когда компилятору нужно дождаться данных из исходного файла (из-за блокировки вызовов ввода-вывода), операционная система может дать ассемблеру полное время ЦП и позволить ей быстрее выполнять свою работу.

0 голосов
/ 03 октября 2009

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

...