Я часто вижу утверждения, что 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-файлов, которые структурированы таким образом?