Как ускорить мою сборку

Копия среды распространяет к подоболочкам, таким образом, это работает:

$ export MY_VAR=200
$ bash
$ echo $MY_VAR
200

но так как это - копия, Вы не можете получить то значение до родительской оболочки — не путем изменения среды, по крайней мере.

Это кажется, что Вы на самом деле хотите пойти шаг вперед, который должен сделать что-то, что действует как глобальная переменная, совместно использованная "одноуровневыми" оболочками, инициируемыми отдельно от родителя — как Ваша новая вкладка в Терминале Gnome.

Главным образом ответ, "Вы не можете, потому что переменные среды не прокладывают себе путь". Однако существует другой ответ, который является, ну, в общем, можно всегда изрубить что-то. Один подход должен был бы записать значение переменной в файл, как ~/.myvar, и затем включайте это в ~/.bashrc. Затем каждая новая оболочка запустится со значения, считанного из того файла.

Вы могли пойти, шаг вперед — делает ~/.myvar будьте в формате MYVAR=200, и затем набор PROMPT_COMMAND=source ~/.myvar, который заставил бы значение быть перечитанным каждый раз, когда Вы получаете новую подсказку. Это все еще не вполне общая глобальная переменная, но это начинает действовать как он. Это не активируется, пока подсказка не возвращается, тем не менее, который в зависимости от то, что Вы пытаетесь сделать, могло быть серьезным ограничением.

И затем, конечно, следующая вещь состоит в том, чтобы автоматически записать изменения в ~/.myvar. Это становится немного более сложным, и я собираюсь остановиться в этой точке, потому что действительно, переменные среды не были предназначены, чтобы быть механизмом связи межоболочки, и лучше просто найти другой способ сделать это.

5
25.09.2017, 14:06
3 ответа

Использование процессов сборки программного обеспечения Most make. Удостоверьтесь, что Вы делаете make используйте -j спор с числом обычно о дважды количестве центральных процессоров Вы имеете, таким образом, make -j 8 подходило бы для Вашего случая.

14
27.01.2020, 20:31
  • 1
    Удвоить количество ядер? Я всегда слышал количество ядер плюс один –  Michael Mrozek♦ 25.08.2011, 23:25
  • 2
    , я думаю, что это зависит от того, являются ли Ваши задания большими или маленькими. +1 имеет смысл для больших заданий, x2 для большого количества небольших. Мое тестирование с созданием ядра на моих 3 базовых машинах показывает этому x2 (-j 6) примерно зона наилучшего восприятия. Больше на самом деле идет немного быстрее, но машина становится неприемлемо безразличной. Мне нравится мочь все еще ввести, в то время как что-то идет на :) –  Caleb 25.08.2011, 23:28
  • 3
    Обычно "оптимальное" количество процессов между n+1 и 2n+1 в зависимости от того, сколько времени проведено в действии ввода-вывода. Идея состоит в том, чтобы иметь некоторый процесс, готовый работать каждый раз, когда один из рабочих процессов должен остановиться для некоторого ввода-вывода (или концы). Если Вы обрабатываете, зависящее от ЦП движение для n+1. Если Вы обрабатываете, связанный ввод-вывод, идут для 2n или даже 3n (если Ваши диски достаточно быстры). По моему опыту, 2n хорошее значение для компиляции чего-то. –  andcoz 26.08.2011, 00:25
  • 4
    Остерегайтесь, это не работает со всеми возможными, делают - базирующиеся системы сборки. В частности, рекурсивные сборки, где Make-файл верхнего уровня начинается, делают (1) в подкаталогах в определенном порядке, обычно не создаст правильно, когда Вы позволяете, делают (1) сборка параллельно, если Вы не очень осторожны относительно документирования зависимостей в Make-файле верхнего уровня. В то время как это может быть сделано работать, быть параллельным сборкам, лучшее оправдание, которое я знаю для пересмотра прежнего мнения системы сборки для предотвращения потребности в рекурсивных сборках. –  Warren Young 26.08.2011, 05:59
  • 5
    @Warren Young, да мы также видели проблемы с параллельными сборками. У нас есть рекурсивная среда сборки, как Вы описали выше. –  Ankur Agarwal 26.08.2011, 08:16

Reniceing группа процесса к-20 является плохой идеей. Этот уровень правильности должен использоваться только критическими по отношению к системе задачами первостепенной важности. Иначе можно освободить скорость отклика или даже заморозить систему. И потенциальная выгода времени компиляции была бы предельной.

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

10
27.01.2020, 20:31

Добавление к ответу rozcietrzewiacz:

Первое большое улучшение было бы дисками, использовать быстрее диски IOPs, т.е. что-то, что достигает 10,000 или 15 000 об/мин, идеально SSD, и затем Вы только ограничены Вашим кошельком.

Случайный пример, SATA 2 SSD Samsung 6Gbps:

http://www.engadget.com/2011/08/17/samsungs-6gbps-ssd-gets-a-consumer-label-october-ship-date/

OCZ имеют некоторые самые экстремальные аппаратные средства, 500,000 IOPs:

http://www.engadget.com/2011/08/02/oczs-z-drive-r4-pcie-ssd-offers-2-800mb-sec-500-000-iops-pl/

Вы могли попытаться копировать дерево в a tmpfs файловая система, но кэш файла Linux уже довольно хороша.

Для использования быстрой разработки сборка пошла бы быстрее при отключении всех оптимизаций. Они имеют тенденцию быть тонкими настройками эры 90-х, когда процессоры были медленными, это - в значительной степени все о IO теперь.

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

2
27.01.2020, 20:31

Теги

Похожие вопросы