Lecture 6: Optimierungen Flashcards
(9 cards)
Warum sind algorithmische Optimierungen meist der wirksamste Performance-Hebel?
Die Wahl eines effizienteren Algorithmus (z. B. iterative statt rekursiver Fibonacci-Berechnung) kann die Laufzeit um Größenordnungen verbessern, noch bevor Mikro-Optimierungen nötig sind.
Welches Prinzip steckt hinter Lookup-Tabellen und welchen Vorteil bieten sie?
Vorberechnete Ergebnisse werden in einem Array gespeichert, sodass spätere Zugriffe in konstanter Zeit (O(1)) erfolgen und teure Berechnungen entfallen. 6. Optimierungen
Was ist Loop-Unrolling und welchen Effekt hat es?
Mehrere Iterationen werden in einer Schleifenrunde zusammengefasst. Dadurch sinkt der Sprung-Overhead und es entstehen weniger Branches; moderne Compiler führen dies oft automatisch durch.
Wie sieht ein einfaches Beispiel für Loop-Unrolling aus?
// Vorher
for (int i = 0; i < n; i++) sum += arr[i];
// Nachher (Unrolling ×4)
for (int i = 0; i + 4 <= n; i += 4)
sum += arr[i] + arr[i+1] + arr[i+2] + arr[i+3];
Was versteht man unter Inline-Expansion und wozu dient sie?
Der Funktionsaufruf wird durch den Funktionscode ersetzt, wodurch Aufruf-Overhead (Stack, Register-Sicherungen) entfällt. Inline erfolgt häufig automatisch durch den Compiler.
Wie können kompakte Datenstrukturen die Performance steigern?
Durch Speichereinsparung (z. B. Bitfelder) passen mehr Daten in den Cache, wodurch Zugriffe schneller werden und weniger Speicherbandbreite benötigt wird.
Geben Sie ein Code-Beispiel für eine kompakte Datenstruktur mit Bitfeldern.
struct MyCompactStruct {
unsigned int isAvailable : 1;
unsigned int userId : 31;
}; // Benötigt nur 32 Bit statt 64 Bit
Was sind generelle Praxistipps für Performance-Tuning laut der PDF?
- Zuerst algorithmische Optimierungen prüfen.
- Vor Mikro-Optimierungen verifizieren, ob der Compiler sie bereits erledigt.
- Nach jeder Änderung messen, ob sich die Optimierung tatsächlich positiv auswirkt.
Wie kann man Speicheroptimierungen bei Lookup-Tabellen erreichen?
Durch Aufteilung der Tabelle in kleinere Abschnitte, sodass nur relevante Teile im Speicher gehalten werden – das spart Platz und verbessert Cache-Nutzung.