Есть ли что-то в языке ниндзя, что делает его быстрее, чем создание? - PullRequest
0 голосов
/ 11 июля 2020

Я часто вижу утверждения, что Ninja быстрее, чем Make, лучше поддерживает инкрементальные сборки и лучше распараллеливает. Это проблема качества реализации или есть что-то в языке Ninja, которое позволяет это?

Я понимаю, что Ninja и Make используют разные форматы файлов для описания графа зависимостей задач. Я понимаю, что Make позволяет использовать более высокоуровневые функции, такие как шары, чем ниндзя. Если используются такие высокоуровневые функции, Make выполняет более сложную задачу, чем Ninja, и мы не можем ожидать, что Make будет быстрее. Это несправедливое сравнение.

Однако предположим, что такие высокоуровневые функции не используются. Никаких подстановок, никаких шаблонных правил, просто базовый c "out_file: in_file1, in_file2 \ n \ tcommand to build" повторяется снова и снова. Отказ от использования такой высокоуровневой функции уравнивает игровое поле между Make и Ninja с точки зрения выполняемой ими задачи. легко трансформируются друг в друга. Это правильно?

Есть ли какая-то внутренняя причина, по которой Make, выполняемый на ограниченных Make-файлах, работает медленнее, чем Ninja? или это просто случай, когда стандартные реализации Make не оптимизированы для Make-файлов, которые структурированы таким образом?

1 Ответ

0 голосов
/ 11 июля 2020

Короче говоря, Ninja выполняет синтаксический анализ быстрее и имеет встроенные функции, которые уменьшают объем синтаксического анализа.

Из философского обзора в руководстве Ninja :

Там, где другие системы сборки являются языками высокого уровня, Ninja стремится быть ассемблером.

Файлы Ninja часто «компилируются» из других make-файлов, что делает его двухэтапным процессом, тогда как Make - один шаг. Двухступенчатый может быть медленнее, чем простой Make. Поскольку в большинстве случаев необходим только второй шаг, эффект net - это быстрее. Это несколько похоже на сравнение скомпилированной и интерпретируемой программы.

Ninja добавляет несколько функций в Make . Реализация этого в make-файле приводит к более длинным и сложным make-файлам и, следовательно, к гораздо большему разбору.

...