This is the Title of the Book, eMatter Edition
Copyright © 2005 O’Reilly & Associates, Inc. All rights reserved.
|
201
First
Max.
Linie
Max.
Linie
Kapitel 10
KAPITEL 10
Beschleunigung von make
make spielt eine wesentliche Rolle im Entwicklungsprozess. Das Programm kombiniert
die Elemente eines Projekts zur fertigen Anwendung, wobei der Entwickler unbemerkt
durch all die subtilen Hürden manövriert wird, die sich aus dem versehentlichen Auslas-
sen einzelner Schritte ergeben könnten. Entwickler versuchen aber immer wieder, ohne
make zu arbeiten, weil ihrer Ansicht nach das Makefile zu langsam ist. Dadurch gehen die
Vorteile von
make verloren. Daher lohnt es sich, sich über die Effizienz seines Makefile
Gedanken zu machen.
Performanceüberlegungen sind immer trickreich. Sie werden es noch mehr, wenn man
die Empfindungen der Benutzer und die verschiedenen Arbeitsweisen mit dem Quelltext
in Betracht zieht. Es lohnt sich nicht, jedes einzelne Ziel im Makefile zu optimieren. Je
nach Umgebung bringen manchmal selbst radikale Optimierungen nur einen kaum spür-
baren Effekt. Wenn man zum Beispiel einen 90 Minuten dauernden Prozess auf 45 Minu-
ten reduziert, hat man trotzdem wenig gewonnen: Selbst die kürzere Zeit ist immer noch
lang genug, um zum Mittagessen zu gehen. Wenn dagegen eine vorher 2 Minuten dau-
ernde Aktion plötzlich nur noch 1 Minute dauert, löst das unter Umständen Begeisterung
aus, weil die Entwickler nur halb so lange Däumchen drehen.
Wenn man ein effizientes Makefile schreiben will, kommt es darauf an, alle Operationen
und ihre Kosten zu kennen. Ebenso bedeutsam ist es aber zu wissen, in welcher Situation
und wie oft sie benötigt werden. In den folgenden Abschnitten beginnen wir deshalb mit
einigen einfachen Methoden zur Zeitmessung und Quantifizierung, die uns bei der
Erkennung von Flaschenhälsen helfen sollen.
Ein komplementärer Ansatz zur Performanceverbesserung ist übrigens die Nutzung von
Parallelisierung und lokaler Netzwerktopologie. Es ist selbst auf einer Maschine mit nur
einem Prozessor durchaus denkbar, dass mehrere gleichzeitig gestartete Kommando-
skripten schneller sind als die Ausführung derselben Skripten nacheinander.
This is the Title of the Book, eMatter Edition
Copyright © 2005 O’Reilly & Associates, Inc. All rights reserved.
202
|
Kapitel 10: Beschleunigung von make
Links
Max.
Linie
Max.
Linie
Benchmarking
Die folgende Tabelle 10-1 zeigt die Ergebnisse einer Performancemessung von typischen
Operationen in
make. Wir erklären die einzelnen Tests und beschreiben, inwieweit die
Geschwindigkeit des eigenen Makefile davon betroffen sein kann.
Die Tests für Windows liefen auf einem Pentium 4 mit 1,9 GHz (ungefähr 3578 Bogo-
Mips)
1
mit 512 MB RAM unter Windows XP. Verwendet wurde dabei Cygwin-make in
der Version 3.80. Sie lief in einem
rxvt-Fenster. Die Linux-Tests erfolgten dagegen auf
einem Pentium 2 mit 450 MHz (891 BogoMips) und 256 MB RAM unter Red Hat Linux 9.
Zunächst sei angemerkt, dass die von
make verwendete Shell durchaus wesentlich für die
Performance des Makefile sein kann. Die
bash ist eine komplexe und sehr leistungsfähige
Shell, aber sie ist auch dementsprechend groß. Wesentlich kleiner ist die
ash. Sie bietet
natürlich auch weniger Möglichkeiten. Für die meisten Aufgaben ist sie aber absolut aus-
reichend. Kompliziert werden unsere Betrachtungen dadurch, dass sich die bash anders
benimmt, wenn sie unter dem Dateinamen /bin/sh aufgerufen wird. In diesem Fall passt
sie ihr Verhalten an das der traditionellen Bourne Shell an. Auf den meisten Linux-Syste-
men ist /bin/sh nichts anderes als ein symbolischer Link auf die
bash. Bei Cygwin ist /bin/
sh dagegen nichts anderes als die ash. Um diese Unterschiede zu berücksichtigen, haben
wir einige Tests dreimal ausgeführt. Die verwendete Shell wird dabei in Klammern
genannt. Wenn dabei von »(sh)« die Rede ist, dann ist damit die über den Link /bin/sh
aufgerufene
bash gemeint.
Tabelle 10-1: Die Kosten typischer Operationen
Operation
Anzahl der
Iterationen
Sekunden pro
Iteration (Windows)
Iterationen pro
Sekunde (Windows)
Sekunden pro
Iteration (Linux)
Iterationen pro
Sekunde (Linux)
make (bash) 1000 0,0436 22 0,0162 61
make (ash) 1000 0,0413 24 0,0151 66
make (sh) 1000 0,0452 22 0,0159 62
Zuweisung 10.000 0,0001 8130 0,0001 10.989
subst (short) 10.000 0,0003 3891 0,0003 3846
subst (long) 10.000 0,0018 547 0,0014 704
sed (bash) ,1000 0,0910 10 0,0342 29
sed (ash) 1000 0,0699 14 0,0069 144
sed (sh) 1000 0,0911 10 0,0139 71
shell (bash) 1000 0,0398 25 0,0261 38
shell (ash) 1000 0,0253 39 0,0018 555
shell (sh) 1000 0,0399 25 0,0050 198
1 Für eine Erklärung der BogoMips siehe http://www.clifton.nl/bogomips.html.

Get GNU make, 3rd Edition now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.