Projekt Systementwicklung

Ähnliche Dokumente
Einführung in die Informatik I

Lösungsvorschlag Serie 2 Rekursion

Großübung zu Einführung in die Programmierung

Einführung in die Informatik I

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen

Folgen und Funktionen in der Mathematik

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

C++ Teil 4. Sven Groß. 30. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 16

Algorithmen und Datenstrukturen SS Übungsblatt 1: Grundlagen

Algorithmen und Datenstrukturen 2

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 7. Entrekursivierung

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Programmieren in C. Speicher anfordern, Unions und Bitfelder. Prof. Dr. Nikolaus Wulff

15. Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Aufrufstapel, Bau eines Taschenrechners, BNF, Parsen

Kapitel 7: Rekursion. Inhalt. Rekursion: Technik Rekursion vs. Iteration

Effizienz von Algorithmen

Vorkurs Informatik WiSe 17/18

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2016/17. Vorbereitende Aufgaben

Klausur Informatik 1 SS 08. Aufgabe Max. Punkte Punkte. Gesamtpunkte:

12. Rekursion Grundlagen der Programmierung 1 (Java)

Aufgabenblatt 4 IT-Security Angewandte Informatik WS 2016/17

Algorithmen & Komplexität

Algorithmen und Komplexität

Einstieg in die Informatik mit Java

Einführung in die Programmierung

Labor Software-Entwicklung 1

Kryptographische Protokolle

Algorithmen und Datenstrukturen

Exponentiation: das Problem Gegeben: (multiplikative) Halbgruppe (H, ), Element a H, n N Aufgabe: berechne das Element

Technische Informatik I - HS 18

Einführung in die Programmierung

Einführung in die Informatik I

Programmieren und Problemlösen

Exponentiation: das Problem

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Definition Algorithmus. Wie beschreibt man Algorithmen?

4 Effizienz und Komplexität 3.1 1

Einführung in die Informatik I

Theoretische Informatik. Ackermann-Funktion. Ali Eyerta

Algorithmen und Datenstrukturen (für ET/IT)

Datenstrukturen und Algorithmen. Christian Sohler FG Algorithmen & Komplexität

Der Dreyfus-Wagner Algorithmus für das Steiner Baum Problem

Hallo Welt für Fortgeschrittene

Dynamische Programmierung. Problemlösungsstrategie der Informatik

Beispiel: Schriftliche Addition

Funktionen in Matlab. Nutzerdefinierte Funktionen können in.m-datei gespeichert werden

Datenstrukturen und Algorithmen

Laufzeitoptimierung in LARSIM

Komplexität von Algorithmen

Effektiv Programmieren in С und C++

Algorithmen und Datenstrukturen

Prof. Dr. Margarita Esponda

Programmieren in C. Funktionen mit Zeigern und Adressen. Prof. Dr. Nikolaus Wulff

1 - Backus-Naur-Form. (a) Ableitung des Wortes /a*(a b)b/ aus der gegebenen BNF:

Kombinatorik: Abzählverfahren (Teschl/Teschl 7) Summenregel. Allgemeiner

1.3 Welche Schritte werden bei der Programmerstellung benötigt? 1.5 Was sind Variablen im Kontext der Programmierung?

Probeklausur: Programmierung WS04/05

Crashkurs C++ - Teil 1

Algorithmen und Datenstrukturen Laufzeitabschätzung

Definitionen/Vorarbeit zum Thema Java

4 Rekursionen. 4.1 Erstes Beispiel

Algorithmen und Datenstrukturen

Rekursive Funktionen (1)

IT-Security. Teil 8b: Rechnen mit beliebiger Genauigkeit Algorithmen

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

CEN1112 Labor Software-Entwicklung

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 5. Asymptotische Laufzeitkomplexität Definition Regeln Beispiele

Das Doppelpack für die Informatik

Rekursive Funktionen (1)

Kombinatorische Optimierung

Flüsse in Netzwerken. Seminar über Algorithmen SoSe Mike Rohland & Julia Schenk

Nachklausur Bitte in Druckschrift leserlich ausfüllen!

Inhalt. Einführung in die Strukturierte Programmierung 15

11. Rekursion, Komplexität von Algorithmen

Rekursion. L. Piepmeyer: Funktionale Programmierung - Rekursion

Asymptotik und Laufzeitanalyse

Abschnitt 7: Komplexität von imperativen Programmen

ÜBUNGS-BLOCK 7 LÖSUNGEN

Erste Java-Programme (Scopes und Rekursion)

Transkript:

Projekt Systementwicklung Effiziente Codierung: Laufzeitoptimierung Prof. Dr. Nikolaus Wulff

Effiziente Codierung Der Wunsch effizienten Code zu schreiben entstammt mehreren Quellen: Zielplattformen mit begrenztem Hauptspeicher verlangen eine Optimierung des Speicherbedarfs. Häufig läuft die Anwendung zu langsam, so dass eine Laufzeitoptimierung kritischer Algorithmen notwendig ist. Selten ist es möglich Laufzeitverhalten und Speicherbedarf gleichzeitig zu optimieren. Guter, effizienter und wartbarer Code ist für Informatiker sowohl eine interlektuelle Herausforderung als auch eine persönliche Befriedigung und trennt Spreu vom Weizen. Prof. Dr. Nikolaus Wulff Projekt Systementwicklung 2

Code Analyse Die Optimierung beginnt haüfig mit einem existierenden Programm, das es zu verbessern gilt. Nur relevante Programmbestandteile sollten optimiert werden. Was nützt die 10-fache Beschleunigung einer Routine, die nur einmal aufgerufen wird, wenn eine wichtige Funktion, die 100000 Mal verwendet wird um einen Faktor 2 zu langsam läuft? Vor die Optimierung kommt daher die Code Analyse, um den kritischen Pfad zu erkennen. Hierbei helfen entsprechende Profiler und ein geübtes Auge. Prof. Dr. Nikolaus Wulff Projekt Systementwicklung 3

Bit- und Byte-Optimierer Während früher noch einzelne Bits in Assembler optimiert wurden, wird dies zunehmend seltener. Z.B. C beinhaltet das Schlüsselwort register dessen Verwendung aber nur bei hardwarenaher Programmierung Sinn macht. Der Code wird schwieriger zu portieren und ist CPU- und plattformabhängig. Optimierende Compiler erkennen meistens selbst welche Variablen in schnelleren Registern passend zur Zielplattform abzulegen sind. Nur noch bei spezieller μ-prozessor Programmierung wird sich noch über Alignment, Register und Speicherauslegung Gedanken gemacht. Prof. Dr. Nikolaus Wulff Projekt Systementwicklung 4

Optimierung von Algorithmen Optimierung im Großen bedeutet die Verfeinerung von Algorithmen und Datenstrukturen. Neben der naiven Programmierung gibt es optimierte Varianten, die dasselbe Ergebnis in besserer Laufzeit oder mit weniger Speicherbedarf liefern. Die Optimierung beruht häufig auf einer grundlegenden meist mathematischen Analyse des Problems. Ein Beispiel soll die Idee erläutern, es gibt leider kein Patentrezept... Prof. Dr. Nikolaus Wulff Projekt Systementwicklung 5

Potenzierung per Rekursion Häufig wird die Potenz x n für natürliche Exponenten n benötigt. Mathematisch wird x n rekursiv definiert x 0 =1 x n =x x n 1 0<n und entsprechend einfach implementiert: double pow(double x, unsigned int n) { if(n==0) return 1; } return x*pow(x,n-1); Prof. Dr. Nikolaus Wulff Projekt Systementwicklung 6

Schnelleres Potenzieren Rekursionen sind meistens nicht sehr effizient und belasten den Stack unnötig. Eine optimierte iterative Implementierung der pow-funktion könnte so aussehen: double pow(double x, unsigned int n) { unsigned int j; double y = (n == 0)? 1 : x; for (j = 1; j < n; y *= x, j++); } return y; x n = j=1 Hier wurden die y-initialisierung und die for- Schleife scheinbar optimiert, aber das wichtigste Optimierungspotenzial wurde übersehen... Prof. Dr. Nikolaus Wulff Projekt Systementwicklung 7 n x

Teile und Herrsche Beide bis lang vorgestellten Varianten haben eine lineare Laufzeit O(n) mit n Multiplikationen. Eine Fallunterscheidung nach geradem und ungeradem Exponenten n, d. h. n=2k oder n=2k+1, liefert eine überraschende Optimierung: (x n ) pow(x,n) x 2k =x k x k =(x k ) 2 x 2k+1 =x x k x k =x (x k ) 2 Eine derartig implementierte pow-funktion berechnet die geometrisch fallende Folge n, n/2, n/4, n/8... und ein solcher Algorithmus hat eine wesentlich effizientere Laufzeit O(log 2 n). Prof. Dr. Nikolaus Wulff Projekt Systementwicklung 8

Optimierte Rekursion Die optimierte rekursive Implementierung double pow(double x, unsigned int n) { double y = 1; if(n) { /* test n>0 */ y = pow(x,n/2); y *= y; if(n%2==1) /* test n odd? */ y *= x; } return y; } ist nur unwesentlich länger als die ursprüngliche Version aber wesentlich effizienter. Spezielle C Operatoren wie n>>1 statt n/2 würden alleine den Kern der Optimierung verfehlen. Prof. Dr. Nikolaus Wulff Projekt Systementwicklung 9

Optimierte pow-funktion Auflösen der Rekursion in Form einer do-while Schleife liefert den optimierten Algorithmus: double pow(double x, unsigned int n) { double y = 1, z = x; do { if(n&1) /* test n odd? */ y *= z; } Frei nach: z *= z; } while(n>>=1); /* test n/2 >0 */ return y; Donald E. Knuth, The Art of Computer Programming Arithmetik, 4.6.3 Algorithmus A Prof. Dr. Nikolaus Wulff Projekt Systementwicklung 10

Zusammenfassung Teile und Herrsche ist ein Ansatz der bei vielen Verfahren zum Einsatz kommt, z.b. Sortieralgorithmen haben Laufzeit O(log n) statt naiv O(n 2 ). Häufig sind optimierte Algorithmen nicht mehr so leicht zu verstehen und erfordern mehr geistige Kapazitäten beim Programmierer... Wie D. E Knuth so schön titelt: Algorithmen zu optimieren ist eine Kunst. Auch beim Game of Life gibt es Optimierungspotential bei der Berechnung der Nachbarn und bei der Auswertung der Regeln... Prof. Dr. Nikolaus Wulff Projekt Systementwicklung 11