Ninja
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Ninja
Система сборки Ninja.
Предложена Google взамен много десятилетней системе make.
Аргументация: значительное ускорение сборки крупных проектов (первоначально была применена в сборке Chromium/Chrome, компиляция-сборка которого может идти и часы).
Предложена Google взамен много десятилетней системе make.
Аргументация: значительное ускорение сборки крупных проектов (первоначально была применена в сборке Chromium/Chrome, компиляция-сборка которого может идти и часы).
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Ninja
В 2-х словах, "на пальцах", описана в не очень свежей публикации (2012-2013) Ninja:
(перевод) от автора разработки Ninja:
Ninja является системой сборки проектов, аналогичной системе Make. В качестве ее входных данных используются команды, необходимые для преобразования исходных файлов в целевые файлы. Ninja использует эти команды для поддержания целевых файлов в актуальном состоянии. В отличие от многих других систем сборки проектов, главная цель процесса проектирования системы Ninja заключалась в достижении максимальной скорости работы.
Я разрабатывал Ninja во время работы над Google Chrome. Работа над Ninja была начата в рамках эксперимента, нацеленного на установление того, может ли быть ускорена сборка Chrome. Для возможности успешной сборки Chrome была добавлена дополнительная цель процесса проектирования: система Ninja должна была без лишних сложностей интегрироваться в состав более масштабной системы сборки проектов.
Я работал над Chrome с 2007 до 2012 года, а разработку системы Ninja начал в 2010 году. Существует множество факторов, влияющих на производительность процесса сборки такого значительного проекта, как Chrome (на сегодняшний день исходный код проекта состоит из 40000 файлов кода на языке C++, на основе которых генерируется бинарный файл размером около 90МБ). Во время работы я исследовал многие из них, начиная от распределения процесса компиляции между несколькими машинами и заканчивая различными приемами, направленными на оптимизацию процесса связывания. Система Ninja в большей степени использует единственный фактор - фронт сборки. Этот параметр характеризует период времени ожидания с начала сборки до момента выполнения первой операции компиляции. Для понимания важности этого фактора необходимо понять сформулированные нами принципы достижения высокой производительности самого браузера Chrome.
Действительно ли миллисекунды имеют такое большое значение? При рассмотрении более важных проблем программного обеспечения беспокойство о них может оказаться глупым. Однако, после работы над проектами, которые собираются долго, мне показалось, что повышается не только продуктивность работы; быстрый цикл сборки придает ощущение легкости, которое доставляет радость при работе с проектом. А наличие кода, с которым приятно работать, является главной причиной разработки мною программного обеспечения. В этом смысле скорость имеет первоочередное значение.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Ninja
Полное описание системы от разработчиков - более чем "необходимо и достаточно" для использования, The Ninja build system :
v1.10.2, Nov 2020
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Ninja
Простейший пример использования ... который я допишу в уже существующий ранее тест с Makefile ... содержимое файла build.ninja:
Код: Выделить всё
olej@nvme:~/2021/OWN_TEST.codes/VLA$ cat build.ninja
cppflags = -Wall -pedantic -std=c++17
rule cpp
command = g++ $cppflags -c $in -o $out
build vla: cpp vla.cc
Код: Выделить всё
CXX += -Wall -pedantic -std=c++17
all: vla
vla: vla.cc
$(CXX) $< -o $@
- Вложения
-
- VLA.tgz
- (7.37 КБ) 67 скачиваний
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Ninja
Сборка:
Код: Выделить всё
olej@nvme:~/2021/OWN_TEST.codes/VLA$ ninja
[1/1] g++ -Wall -pedantic -std=c++17 -c vla.cc -o vla
vla.cc: In function ‘int main(int, char**)’:
vla.cc:17:6: warning: ISO C++ forbids variable length array ‘arr_num’ [-Wvla]
17 | int arr_num[ num ]; // Variable-Length Arrays (ISO/IEC 9899:1999)
| ^~~~~~~
vla.cc:27:7: warning: ISO C++ forbids variable length array ‘arr_log’ [-Wvla]
27 | bool arr_log[ num2 ];
| ^~~~~~~
Код: Выделить всё
olej@nvme:~/2021/OWN_TEST.codes/VLA$ ls -l vla
-rw-rw-r-- 1 olej olej 26104 фев 14 12:20 vla
olej@nvme:~/2021/OWN_TEST.codes/VLA$ ./vla 30
< -74 51 -8 7 -56 -91 36 36 87 -23 4 67 -94 -90 6 34 -99 -23 -87 -17 38 18 87 70 5 -82 31 -17 40 82 >
< - + - + - - + + + - + + - - + + - - - - + + + + + - + - + + >
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Ninja
Варианты запуска:
Код: Выделить всё
olej@nvme:~$ ninja -h
usage: ninja [options] [targets...]
if targets are unspecified, builds the 'default' target (see manual).
options:
--version print ninja version ("1.10.0")
-v, --verbose show all command lines while building
-C DIR change to DIR before doing anything else
-f FILE specify input build file [default=build.ninja]
-j N run N jobs in parallel (0 means infinity) [default=3 on this system]
-k N keep going until N jobs fail (0 means infinity) [default=1]
-l N do not start new jobs if the load average is greater than N
-n dry run (don't run commands but act like they succeeded)
-d MODE enable debugging (use '-d list' to list modes)
-t TOOL run a subtool (use '-t list' to list subtools)
terminates toplevel options; further flags are passed to the tool
-w FLAG adjust warnings (use '-w list' to list warnings)
Код: Выделить всё
olej@nvme:~/2021/OWN_TEST.codes/VLA$ ninja vla
[1/1] g++ -Wall -pedantic -std=c++17 -c vla.cc -o vla
vla.cc: In function ‘int main(int, char**)’:
vla.cc:17:6: warning: ISO C++ forbids variable length array ‘arr_num’ [-Wvla]
17 | int arr_num[ num ]; // Variable-Length Arrays (ISO/IEC 9899:1999)
| ^~~~~~~
vla.cc:27:7: warning: ISO C++ forbids variable length array ‘arr_log’ [-Wvla]
27 | bool arr_log[ num2 ];
| ^~~~~~~
Код: Выделить всё
olej@nvme:~/2021/OWN_TEST.codes/VLA$ ninja -j4 vla
[1/1] g++ -Wall -pedantic -std=c++17 -c vla.cc -o vla
vla.cc: In function ‘int main(int, char**)’:
vla.cc:17:6: warning: ISO C++ forbids variable length array ‘arr_num’ [-Wvla]
17 | int arr_num[ num ]; // Variable-Length Arrays (ISO/IEC 9899:1999)
| ^~~~~~~
vla.cc:27:7: warning: ISO C++ forbids variable length array ‘arr_log’ [-Wvla]
27 | bool arr_log[ num2 ];
| ^~~~~~~
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Ninja
Следующий вопрос рассмотрения - возможность генерирования build.ninja файла сценария Ninja из-под CMake ... это новая (относительно) возможность, задекларированная сначала под Windows и MacOS.
И есть ли под Linux? ... тут многое будет зависеть от версий!
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Ninja
Вопрос: Почему такой интерес (мой и по публикациям вообще) к Ninja в противовес make?
Ответы (как я их понимаю или предполагаю):
1. Утверждается, что инкрементная сборка Ninja намного быстрее чем традиционного make;
2. Эту систему сборки (вместе с GN) используется и проталкивается Google (Chromium и др.) - все кто хотели бы включить в свои корпоративные проекты какие-то инструментарии Chromium, гораздо легче их включают используя с ними единую систему сборки;
3. Возможно, скрипты мета-генератора GN, используемого Google для Ninja в своих проектах, писать для крупных проектов проще, чем для публичного мета-генератора CMake ... а вручную скрипты Makefile и для Ninja для таких проектов никто не пишет (громоздко и сложно);
Что ещё?
Ответы (как я их понимаю или предполагаю):
1. Утверждается, что инкрементная сборка Ninja намного быстрее чем традиционного make;
2. Эту систему сборки (вместе с GN) используется и проталкивается Google (Chromium и др.) - все кто хотели бы включить в свои корпоративные проекты какие-то инструментарии Chromium, гораздо легче их включают используя с ними единую систему сборки;
3. Возможно, скрипты мета-генератора GN, используемого Google для Ninja в своих проектах, писать для крупных проектов проще, чем для публичного мета-генератора CMake ... а вручную скрипты Makefile и для Ninja для таких проектов никто не пишет (громоздко и сложно);
Что ещё?
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Ninja
Но вот конкретных цифр я особенно не нашёл ... а вот такая конкретная публикация Make vs Ninja Performance Comparison
Здесь утверждается (экспериментально на 2-х проектах) что скорости make и Ninja на полных сборках больших проектов практически не различаютсяJan 31, 2015
...
I wanted to measure the performance of Make and Ninja for several projects, namely chrono and ogre.
Chrono 383 files
Ogre 495 files
Вот заключительная фраза статьи:
Ninja и Make очень близки по производительности. У него меньше накладных расходов при выполнении инкрементных сборок, но для полных сборок прирост производительности будет незначительным.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей