Beim Kompilieren von Programmen unter Mac OS X wird standardmäßig keine Optimierung des Codes durchgeführt, d.h. die erzeugten Programme nutzen die vollen Hardware-Fähigkeiten des Macs nicht aus. Allerdings können diese Programme auf jedem (neueren) Mac ausgeführt werden, während optimierte Anwendungen häufig nur auf einer Plattform (beispielsweise G4) laufen. Diese Dokumentation erläutert einige Möglichkeiten einiges mehr aus seinen Mac OS X-Programmen herauszuholen. Aber Vorsicht: Die hier vorgestellten Möglichkeiten zur Optimierung beziehen sich allesamt auf die Kompilierung vorhandenen Quellcodes, d.h. du musst über den Code des Programmes verfügen und wissen, wie man dieses kompiliert/übersetzt. Kenntnisse im Umgang mit make dürften auch von Vorteil sein.
Apples GCC kennt laut Handbuch zwei Arten der Optimierung:
Mit dem Compiler-Schalter -Os versucht der gcc, die ausführbare Datei so zu optimieren, dass die resultierende Datei möglichst klein ist. Zusätzlich werden einige Optimierungen der Stufe 2 (-O2, siehe im folgenden Abschnitt) durchgeführt.
Meine bisherige Erfahrung zeigt allerdings, dass eine Optimierung der Dateigröße nur wenige Bytes (!) Ersparnis bringt, während Performance-Optimierungen deutlicher spürbar sind:
Der zu den Apple Developer Tools gehörende gcc kennt vier Optimierungsstufen, von denen wir lediglich die letzten beiden betrachten, da die erste (-O bzw. -O1) lediglich „ein bisschen Optimierung“ darstellt und die zweite im Zusammenhang mit -Os steht.
Mit dieser Stufe wird der Code so kompiliert, dass er maximal performant ausgeführt werden kann.
Dazu werden Schleifen (while
) entrollt, besonders performante mathematische Funktionen benutzt, …
Ohne die Verwendung der Angabe einer bestimmten Plattform wird der Code für PowerPC G5-Prozessoren optimiert, soll der Code allerdings auf einem G4 lauffähig sein (das ist in unserem Fall so), muss die Plattform explizit angegeben werden:
-mcpu=7450
Damit wird der Code für den PowerPC G4 optimiert kompiliert.
Um optimierte shared libraries zu kompilieren, muss zusätzlich die Option -fPIC gesetzt sein, weil der sonst erzeugte Binärcode nicht als library gelinkt werden kann.
Wie fink Programme kompiliert, wird in den meisten Fällen in configure-Skripten, Makefiles sowie den .info-Datgeien festgelegt.
Glücklicherweise müssen wir nicht erst die Konfigurations- oder Makefiles patchen, um Compiler-Optionen zu setzen, sondern es reicht die Variable SetCFLAGS in der zu einem Programm gehörenden .info-Datei anzupassen.
(Zum Programm gnuplot gehört beispielsweise die .info-Datei /sw/fink/10.3/stable/main/finkinfo/sci/gnuplot.info, sofern man Panther bzw. Mac OS X 10.3 besitzt.)
Steht in der Datei beispielsweise SetCFLAGS: -Wno-long-double, müssen wir hier die gewünschten Optimierungsflags hinzufügen, im Falle einer allgemeinen G4-Optimierung steht dann folgende Zeile in der .info-Datei:
SetCFLAGS: -Wno-long-double -fast -mcpu=7450 -fPIC
Wichtig ist hierbei die Option -fPIC, falls das gewählte Programm auch aus shared libraries besteht, was bei vielen Fink-Programmen der Fall ist.
Siehe hierzu die Anmerkung in der GCC-Handbuchseite bei Apple:
To build shared libraries with -fast, specify -fPIC on the command line as -fast turns on -mdynamic-no-pic otherwise.