|
Make, ускорение процесса сборки проектов |
|
|
|
Aug 21 2012, 17:25
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Сегодня попробовал задать мейку во сколько потоков ему работать, т.к. у меня в системе видятся 4 ядра (1+HT)*2 то я задал 4: Код make -j 4 all Результат: проект собрался ровно в 2 раза быстрее! Спешу поделиться своей радостью со всеми:-)
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Aug 22 2012, 12:25
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(demiurg_spb @ Aug 21 2012, 22:39)  А можно-ли как-то из самого мейк-файла передавать мейк-утилите эту же информацию что и аргумент j? Из окружения (и на каждом компе своё), в переменной MAKEFLAGS (через эту же переменную передаются флаги «вложенным» вызовам $(MAKE) ) Цитата(IgorKossak @ Aug 22 2012, 09:42)  Получил следующую хохму - в одном потоке делалась компиляция, а в другом благополучно всё чистилось. Таким образом, когда дело дошло до линкера, то вылезла масса ошибок из-за нехватки объектных файлов.  Так если в файловом менеджере запустить копирование какого-то каталога и тут же чразу его удаление, так тоже весело будет. Если на -j рассчитывать, то надо бы цель отдельную Код rebuild: $(MAKE) clean $(MAKE)
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Aug 22 2012, 15:44
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(ReAl @ Aug 22 2012, 18:25)  Если на -j рассчитывать, то надо бы цель отдельную Код rebuild: $(MAKE) clean $(MAKE) У меня была именно такая цель: Код build: clean all И всё равно с -j получилась ерунда - при первом вызове ничего не произошло (как будто всё up-to date), и лишь при втором начало-таки компилироваться. Но, что меня удивило больше - скорость компиляции визуально не изменилась. Поэтому я убрал -j, отложив многопоточную сборку до освоения scons (то есть до следующей жизни  ).
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 22 2012, 20:14
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(ReAl @ Aug 22 2012, 16:25)  Из окружения (и на каждом компе своё), в переменной MAKEFLAGS... То что надо, спасибо! У меня для сборки всех конфигураций понаписаны батники типа этого (в таком варианте гонки целей исключены, но хотелось бы более элегантное решение найти): Код set MAKEFLAGS=-j 4 for /L %%i in (0#,1#,36#) do ( call make.exe clean --quiet COMPILE_TYPE=%%i if ERRORLEVEL 1 goto ERROR call make.exe all --quiet COMPILE_TYPE=%%i if ERRORLEVEL 1 goto ERROR call make.exe clean --quiet COMPILE_TYPE=%%i if ERRORLEVEL 1 goto ERROR call make.exe boot_all --quiet COMPILE_TYPE=%%i if ERRORLEVEL 1 goto ERROR ) goto EOF :ERROR echo Compilation error! pause exit :EOF Эффект от многопоточной сборки значительный: вместо 13 минут всё за 7 минут пересобирается. И чем больше исходников в проекте тем эффект более выражен. Цитата(AHTOXA @ Aug 22 2012, 19:44)  Но, что меня удивило больше - скорость компиляции визуально не изменилась. А что за процессор в компьютере?
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Aug 23 2012, 06:50
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(AHTOXA @ Aug 22 2012, 18:44)  У меня была именно такая цель: Код build: clean all И всё равно с -j получилась ерунда - при первом вызове ничего не произошло (как будто всё up-to date), и лишь при втором начало-таки компилироваться. Конечно, цель-то таки ж не такая. Тут build зависит от двух других, которые могут и в разном порядке достигаться. Если сначала достигнется all (проверили — всё на месте) и только потом clean (пока то проверялось — составляли список чего тереть), то такой эфект и будет. Я привёл цель без зависимостей с двумя последовательными действиями, каждое из которых может распараллеливаться, но между ними «точка следования» :-) Сейчас на ноуте с i3 (два ядра по два потока) типовая команда make -j 4 program, ещё ни разу непоняток из-за кривого порядка не было.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Aug 23 2012, 07:53
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Да, наверняка всё так и есть. Но мне это не нравится. Часто вижу варианты типа: Код all: message_begin elf size message_end Получается, что все эти варианты тоже будут глючить от многопоточности. Имхо, надо было и в такой перечень целей вставить «точки следования».
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 23 2012, 08:52
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(AHTOXA @ Aug 23 2012, 11:53)  Да, наверняка всё так и есть. Но мне это не нравится. Часто вижу варианты типа: Код all: message_begin elf size message_end Получается, что все эти варианты тоже будут глючить от многопоточности. Имхо, надо было и в такой перечень целей вставить «точки следования». Банальная безграмотность создателей таких make файлов.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|