Fragen? Antworten! Siehe auch: Alternativlos
Aber man hört ja, dass ninja furchtbar viel schneller sein soll, also habe ich das mal als Feierabendprojekt angefangen. GNU make ist programmierbar und damit ninja deutlich voraus in der Expressivität der Buildanweisungen. Ich musste hier also einiges von Hand konvertieren, aber bin jetzt so weit, dass ich mit ninja alle Dateien kompilieren kann.
Gucken wir doch mal!
% time make -s -j16 libowfat.aTsja. Ein Wort mit X. Das war wohl nix.
make -s -j16 libowfat.a 14.03s user 6.11s system 1222% cpu 1.647 total
% time ninja
ninja 15.98s user 7.85s system 1530% cpu 1.557 total
Der ninja-Build sagt einem ja am Ende, wie viele Edges er hatte. Das sind 570. Wir reden hier also nicht von einem Trivialprojekt.
Klar, das Buildsystem tut auch nicht so viel. Der ruft halt den Compiler ganz oft auf, und der braucht dann Zeit. Insofern weiß ich auch nicht, woher da die großen Einsparen kommen sollen am Ende.
Ich vermute jetzt aber, dass wenn ninja in anderer Leute Projekten mehr rausholt, dass das dann weniger an ninja oder make und mehr an schlechten Makefiles liegt.
Und ja, was automake und cmake da generieren, am besten noch mit rekursiven make-Aufrufen, das kostet dann natürlich mehr beim Bauen. Nicht dass mein Makefile jetzt besonders tiefergelegt und auf Sparsamkeit getrimmt wäre. Aber es versucht natürlich, wenig überflüssige Dinge zu tun. Klar.
Update: Kurzer Hinweis zum Lesen dieser time-Ausgaben. Der einzige relevante Teil für den Vergleich bei so einer kurzen Laufzeit ist der letzte Wert, "total". Das ist die vergangene Zeit laut einer Stopuhr. Der Kram davor sind Implementationsdetails, die euch eigentlich egal sein können, außer ihr versucht gerade etwas spezifisches zu optimieren. Der Build mit ninja war schneller, aber der Abstand war von der Größenordnung her vernachlässigbar.