Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Performance-Optimierung in JAVA Bernegger Hans Peter Klinger Andreas Schneider Martin.

Ähnliche Präsentationen


Präsentation zum Thema: "Performance-Optimierung in JAVA Bernegger Hans Peter Klinger Andreas Schneider Martin."—  Präsentation transkript:

1 Performance-Optimierung in JAVA Bernegger Hans Peter Klinger Andreas Schneider Martin

2 2 Themen Geschwindigkeit von Java-Programmen, Geschwindigkeit von Java-Programmen, Interpretierter und kompilierter Code, Interpretierter und kompilierter Code, Tuning von String-Zugriffen, Tuning von String-Zugriffen, Verwendung von Vektoren und Listen, Verwendung von Vektoren und Listen, Tuning von Dateizugriffen, Tuning von Dateizugriffen, Aspekte der Speicheroptimierung in Java, Aspekte der Speicheroptimierung in Java, Profiling. Profiling.

3 3 Überblick (1) Charakteristika von Java; Charakteristika von Java; Verarbeitung von Zeichenketten: Verarbeitung von Zeichenketten: Langsame String-Verkettung, Langsame String-Verkettung, Optimierte String-Verkettung, Optimierte String-Verkettung, Weitere String-Operationen, Weitere String-Operationen, StringBuffer-Methode toString(); StringBuffer-Methode toString(); Vektoren und Listen: Vektoren und Listen: Die Klasse java.util.Vector, Die Klasse java.util.Vector,

4 4 Überblick (2) ArrayList und LinkedList; ArrayList und LinkedList; Dateizugriffe; Dateizugriffe; Speicheroptimierung; Speicheroptimierung; Profiling: Profiling: Profiling-Grundlagen, Profiling-Grundlagen, Einsatz eines Profilers; Einsatz eines Profilers; Allgemeine Verbesserungen. Allgemeine Verbesserungen.

5 5 Charakteristika von Java Plattformunabhängigkeit; Plattformunabhängigkeit; Just-In-Time-Compiler (JIT): Just-In-Time-Compiler (JIT): Schnellere Ausführung von Methoden; Schnellere Ausführung von Methoden; Performance-Einbußen durch Checks bei Performance-Einbußen durch Checks bei Bereichsüberschreitungen bei (Arrays, Strings), Bereichsüberschreitungen bei (Arrays, Strings), Dereferenzierung von Zeigern gegen null, Dereferenzierung von Zeigern gegen null, Zuweisungen von Objektinstanzen, Zuweisungen von Objektinstanzen, vielen arithmetischen Operationen. vielen arithmetischen Operationen.

6 6 Langsame String-Verkettung Sample-Java-Code: Sample-Java-Code: String s = ""; for (int i=0; i<20000; i++) s += *"; (1) s += *"; (1) Interne Übersetzung des Compilers: Interne Übersetzung des Compilers: s = new StringBuffer(s). append("*").toString(); (1*) s = new StringBuffer(s). append("*").toString(); (1*) temporäre Objekte, wdh. Kopieren der Zeichen im StringBuffer-Konstruktor temporäre Objekte, wdh. Kopieren der Zeichen im StringBuffer-Konstruktor.

7 7 Optimierte String-Verkettung Sample-Java-Code: Sample-Java-Code: StringBuffer b = new StringBuffer(1000); for (int i=0; i<20000; i++) b.append(*); (2) b.append(*); (2) String s = b.toString(); Vorteile: Vorteile: Aufruf von (2) meist in konstanter Zeit, Aufruf von (2) meist in konstanter Zeit, Faktor 10 schneller, Faktor 10 schneller, temporäre Objekte weniger temporäre Objekte weniger.

8 8 Weitere String-Operationen Einfügen in Strings: Einfügen in Strings: s = "*" + s; s = "*" + s; b.insert(0, "*"); b.insert(0, "*"); Faktor 4 und keine temporären Objekte. Faktor 4 und keine temporären Objekte. Löschen in Strings: Löschen in Strings: s = s.substring(0, 1000) + s.substring(2000); s = s.substring(0, 1000) + s.substring(2000); s = b.delete(1000, 2000).toString(); s = b.delete(1000, 2000).toString(); Löschen anstelle von Verbinden. Löschen anstelle von Verbinden.

9 9 StringBuffer-Methode toString() Kein Kopiervorgang beim Aufruf, Kein Kopiervorgang beim Aufruf, derselbe verwendete Puffer, derselbe verwendete Puffer, shared-Flag im StringBuffer-Objekt, shared-Flag im StringBuffer-Objekt, Abfrage bei verändernden StringBuffer- Methoden Abfrage bei verändernden StringBuffer- Methoden und ev. Kopieren vor der Veränderung; und ev. Kopieren vor der Veränderung; echter Kopiervorgang erst nötig bei schreibendem Zugriff auf den StringBuffer. echter Kopiervorgang erst nötig bei schreibendem Zugriff auf den StringBuffer.

10 10 Die Klasse java.util.Vector Vector: Vector: Speicherung von Listen von Objekten. Speicherung von Listen von Objekten. Sequentieller und wahlfreier Zugriff. Sequentieller und wahlfreier Zugriff. Implementierung des Datenpuffers als Array. Implementierung des Datenpuffers als Array. Attribute Kapazität und Ladefaktor. Attribute Kapazität und Ladefaktor. Standard: Kapazität=10, Ladefaktor=0 (=2*). Standard: Kapazität=10, Ladefaktor=0 (=2*). Auch ohne Multithreading-Betrieb infolge von synchronized-Methoden entsprechend langsam. Auch ohne Multithreading-Betrieb infolge von synchronized-Methoden entsprechend langsam.

11 11 LinkedList und ArrayList LinkedList: LinkedList: Implementierung als doppelt verkettete Liste. Implementierung als doppelt verkettete Liste. Keine Kopiervorgänge beim Erweitern. Keine Kopiervorgänge beim Erweitern. Vielzahl der allozierten Objekte. Vielzahl der allozierten Objekte. ArrayList: ArrayList: Implementierung ähnlich wie Vector. Implementierung ähnlich wie Vector. Infolge fehlender synchronized-Attribute sehr hohe Performance. Infolge fehlender synchronized-Attribute sehr hohe Performance.

12 12 Dateizugriffe (1) Writer-Klassen: Writer-Klassen: Verarbeitung von Character-Streams. Verarbeitung von Character-Streams. 16-Bit breite UNICODE-Zeichen. 16-Bit breite UNICODE-Zeichen. Kapselung in einen BufferedWriter. Kapselung in einen BufferedWriter. Meisten externen Dateien arbeiten mit 8-Bit- Zeichen Konvertierung durch Methoden der Klasse sun.io.CharToByteConverter. Meisten externen Dateien arbeiten mit 8-Bit- Zeichen Konvertierung durch Methoden der Klasse sun.io.CharToByteConverter.

13 13 Dateizugriffe (2) OutputStream-Klassen: OutputStream-Klassen: Arbeiten mit Bytes anstelle von Zeichen. Arbeiten mit Bytes anstelle von Zeichen. Keine aufwendige Konvertierung. Keine aufwendige Konvertierung. Ausgabe der niederwertigen 8 Bit je Zeichen. Ausgabe der niederwertigen 8 Bit je Zeichen. RandomAccessFile: RandomAccessFile: Ungepufferter Byteweiser Zugriff langsam. Ungepufferter Byteweiser Zugriff langsam. Verarbeitung eines ganzen Arrays von Bytes. Verarbeitung eines ganzen Arrays von Bytes. int num = file.read(buf); int num = file.read(buf);

14 14 Speicheroptimierung Jede Allozierung kostet Rechnerzeit. Jede Allozierung kostet Rechnerzeit. Objekte recyceln. Objekte recyceln. Nicht mehr referenzierter Speicher. Nicht mehr referenzierter Speicher. Große Mengen an temporären Objekten. Große Mengen an temporären Objekten. Objektreferenzen OutOfMemoryError. Objektreferenzen OutOfMemoryError. System.gc(); System.gc(); Variablen explizit Wert null zuweisen. Variablen explizit Wert null zuweisen.

15 15 Profiling-Grundlagen Überwachung und Messung: Überwachung und Messung: Performanceparameter (z.B. CPU-Zeit), Performanceparameter (z.B. CPU-Zeit), Anzahl der allozierten Objekte, Anzahl der allozierten Objekte, Anzahl der Aufrufe bestimmter Methoden. Anzahl der Aufrufe bestimmter Methoden. Profiler-API: JVMPI. Profiler-API: JVMPI. Beispielimplementierung hprof: Beispielimplementierung hprof: Brauchbares, Brauchbares, aber rein textuelles Analyse-Tool. aber rein textuelles Analyse-Tool.

16 16 Einsatz eines Profilers Programm mit Option –Xrunhproof starten. Programm mit Option –Xrunhproof starten. Größen Rechenzeit- und Speicherverbrau- cher werden ermittelt, und über ihre Stack- traces wird folg. in LOG-File geschrieben: Größen Rechenzeit- und Speicherverbrau- cher werden ermittelt, und über ihre Stack- traces wird folg. in LOG-File geschrieben: Woher werden sie aufgerufen? Woher werden sie aufgerufen? Wie tragen sie zum Programmergebnis bei? Wie tragen sie zum Programmergebnis bei? Programm kann verbessert werden. Programm kann verbessert werden. Zufriedenstellend oder erneut von vorne. Zufriedenstellend oder erneut von vorne.

17 17 Allgemeine Verbesserungen (1) Hoher Anteil von lokalem Code am Rechenzeitverbrauch: Hoher Anteil von lokalem Code am Rechenzeitverbrauch: Vermindern der Anzahl von Schleifendurchläufen, Vermindern der Anzahl von Schleifendurchläufen, Verwendung von Ganzzahlen, Verwendung von Ganzzahlen, Herausziehen von schleifeninvariantem Code, Herausziehen von schleifeninvariantem Code, Vermeiden der Doppelauswertung von gemeinsamen Teilausdrücken, Vermeiden der Doppelauswertung von gemeinsamen Teilausdrücken, Wiederverwenden bekannter Teilergebnisse, Wiederverwenden bekannter Teilergebnisse,

18 18 Allgemeine Verbesserungen (2) Verwendung alternativer Datenstrukturen, Verwendung alternativer Datenstrukturen, Eliminieren von unbenutztem Code, Eliminieren von unbenutztem Code, Reduzieren der Stärke von Ausdrücken. Reduzieren der Stärke von Ausdrücken. Hoher Anteil in Untermethoden: Hoher Anteil in Untermethoden: Verminderung der Aufrufhäufigkeit, Verminderung der Aufrufhäufigkeit, Ersetzung durch performantere Aufrufe, Ersetzung durch performantere Aufrufe, Erhöhung der Ablaufgeschwindigkeit. Erhöhung der Ablaufgeschwindigkeit. System.currentTimeMillis(); System.currentTimeMillis();


Herunterladen ppt "Performance-Optimierung in JAVA Bernegger Hans Peter Klinger Andreas Schneider Martin."

Ähnliche Präsentationen


Google-Anzeigen