Code optimieren – Die richtige Stelle finden

19. Februar 2009, 8:44 Uhr | Elan Tanzer
Diesen Artikel anhören

Fortsetzung des Artikels von Teil 2

Echte Verwendungsszenarien

RealView Profiler kann sehr viele Leistungsdaten aus der Binärdatei ermitteln, ohne den Code zu verwenden, und bietet daher ein recht genaues Bild des Anwendungsverhaltens. Das Tool analysiert eine Reihe von Streaming-Ablaufverfolgungsdaten, die entweder mit »Trace 2.0« bei Ausführung auf Hardware oder mit den »Real Time System Models« von ARM gesammelt werden können, die der »System Generator« erstellt. Dadurch können Benutzer schnell Profile der Anwendung erstellen, indem sie realistische Szenarien ausführen und diese über einen Zeitraum von Minuten, Stunden oder sogar Tagen analysieren. Der Ablauf wird im Folgenden anhand einer Fallstudie dargestellt. Dabei ist George ein Softwareentwickler, dem aufgrund von Zeitmangel nur wenige Stunden bleiben, um einen Videodecoder namens »Xvid« (eine MPEG-4-Videocodec-Bibliothek) zu optimieren. Als erstes führt er die Anwendung in RealView Profiler aus. George hatte die Hardware nicht zur Verfügung, deshalb läuft die Anwendung auf einem Modell seines »ARM1176JZ-S«-Systems, das der Systemgenerator erstellt hat. Um eine wiederholbare Anzahl an Schritten für die genaue Messung seiner Leistungsdaten zu erstellen, schränkt er die Anwendung so ein, dass sie nur genau 100 Frames eines Videos dekodiert und abspielt.

passend zum Thema

George will zuerst herausfinden, welche Auswirkungen auf Leistung und Größe die Optimierungseinstellungen für die gesamte Anwendung haben. Eine einfache Anwendungsoptimierung genügt, wenn die armcc-Compileroptionen für die Zeitoptimierung mit --Otime und --O3 für die höchste Optimierungsstufe zum Einsatz kommen.

Nach dem Erstellen des Projekts und Ausführen auf demselben Zielgerät findet ein Vergleich der Ergebnisse statt. In der auf Zeit optimierten Anwendung waren weniger Zyklen nötig, jedoch ist die Anwendung etwas größer geworden. Beim Ausführen desselben Codes in der auf Größe optimierten Anwendung wurde mehr Zeit beansprucht, die Größe war jedoch wesentlich geringer.

Optimieren von Funktionen

Als Nächstes richtet George seine Aufmerksamkeit auf die zwei Bereiche im Code, die ihn am meisten interessieren: Overhead für Aufrufe und Hotspots. Die zusammengefasste Ansicht der Analysedatei wird nach der Anwendungsausführung automatisch geöffnet und zeigt ihm die fünf stärksten Hotspots für Zeit, Verzögerungen und Speicherzugriffe an. In diesem Beispiel heißt die am stärksten beanspruchte Funktion im Zeitdiagramm »yv12_to_rgb55_c« (Bild 1).

George ändert daraufhin die Optimierungseinstellungen für diese spezielle Funktion. Nun soll die gesamte Anwendung mit --Ospace auf Größe optimiert werden. Ferner führt er eine starke Optimierung auf Zeit dieser spezifischen Funktion mit den »#pragma«-Befehlen vor und nach der Funktion durch. Dabei gehen Flags an den Compiler, damit jener diese Funktion mit --Otime kompiliert (Kasten »#pragma«). Das erneute Erstellen und Ausführen der Anwendung zeigt sofort die Optimierungsergebnisse.

job_07_Bild01__af_03.jpg
Bild 1: Das Hotspot-Diagramm mit den Funktionen, die am meisten Zeit beanspruchen

  1. Code optimieren – Die richtige Stelle finden
  2. Auswählen und Optimieren des Algorithmus
  3. Echte Verwendungsszenarien
  4. Code optimieren – Die richtige Stelle finden

Jetzt kostenfreie Newsletter bestellen!