Mac OS X-Anwendungen für G4 optimieren

  1. Einleitung
  2. Allgemeine Optimierungen
    1. … nach Größe
    2. … nach Geschwindigkeit
  3. Fink-Programme für G4 optimieren
  4. Literatur, Links, Weiterführendes

Einleitung

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.

Allgemeine Optimierungen

Apples GCC kennt laut Handbuch zwei Arten der Optimierung:

Optimierung nach Größe der Executable

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:

Optimierung nach Ausführungsgeschwindigkeit der Executable

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.

-O3
Diese Optimierungsstufe ist schon recht gut, weshalb diese bei der Übersetzung vieler Programme benutzt wird. Folge ist u.a., dass kurze Funktionsblöcke inline kompiliert werden, keine NULL-Pointer-Checks durchgeführt werden oder der Code in einer bestimmten Weise ausgerichtet wird (align).
-fast

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.

Fink-Programme für G4 optimieren

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.

Literatur, Links, Weiterführendes