Daniel Klein Michael Piechullek

Slides:



Advertisements
Ähnliche Präsentationen
Software Engeniering II
Advertisements

der Universität Oldenburg
Objektorientierte Programmierung
der Universität Oldenburg
Strategie (Strategy / Policy) Ein objektbasiertes Verhaltensmuster Stephan Munkelt, Stefan Salzmann - 03IN.
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Kapselung , toString , equals , Java API
1 Spezielle Packages des Java SDK (1.4) java.nio.
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
der Universität Oldenburg
der Universität Oldenburg
Objektorientierte Programmierung
der Universität Oldenburg
Ausnahmen HS Merseburg (FH) WS 06/07.
Sortieren mit Binären Bäumen
Java: Objektorientierte Programmierung
Sortierverfahren Richard Göbel.
Java: Dynamische Datentypen
Listen Richard Göbel.
Java: Grundlagen der Sprache
Java: Grundlagen der Objektorientierung
Ein Beispiel in Java.
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Dynamische Webseiten mit PHP
Objektorientierte Programmierung JDK-Klassenbibliothek
Programmieren mit JAVA
Praxis-Repetitorium JAVA zusätzliche, ergänzende Lehrveranstaltung
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Projektplan: Fachgebiet Software Engineering Übersicht © Albert Zündorf, Kassel University.
Vortrag III Hier in der Vorlesungszeit! Anwesenheitspflicht Jede Gruppe hat 6 Minuten! Stellt eure GUI vor –was ihr besonderes gemacht habt –Spektakuläre.
Software Design Patterns Creational Patterns Structural Patterns Behavioral Patterns –Behavioral Class Patterns Interpreter Template Method Pattern –Behavioral.
Einführung in C EDV1 - 03C-Einführung.
Portierung von Java nach C
DVG Einführung in Java1 Einführung in JAVA.
DVG Klassen und Objekte
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
Einführung in die Programmierung Datensammlung
© 2005 Pohlig - Taulien Datenströme GK Informatik 1 Datenströme.
Thema: Fibonacci-Zahlen
Einführung in die Programmiersprache Java
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
Java Garbage Collection Angelika Kusel, Überblick Was ist Garbage Collection? Vor- und Nachteile von GC GC-Algorithmen/Verfahren Java Garbage.
Präsentation von Lukas Sulzer
Variablenkonzept Klassisch, in Java Basistyp
Unterprogramme in JAVA
EPROG Tutorium #5 Philipp Effenberger
Die Architektur der Java-VM
Wilfried Imrich CuP - Java Erste Vorlesung Entspricht ungefähr Kapitel 1.1 des Skriptums Wilfried Imrich Montanuniversität Leoben Freitag, 4. Oktober 2002.
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
Neuerungen in Java 5/6/7. Stefan Bühler für InfoPoint Überblick Java 5 neue Sprachfeatures Erweiterungen Klassenbibliothek Java 6 Erweiterungen.
Learning By Doing Ausnahmebehandlung Exceptions (Ausnahmebehandlung) Typische Fehlverhalten zur Laufzeit: s. Buch S. 287ff -Verwendung von null-Objekten.
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
Parallelisierung für Multiprozessor-Maschinen
Programmiervorkurs WS 2014/15 Methoden
3. Beschreibung von Abläufen durch Algorithmen 3.4 Zufall
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Übung Informatik I exercise01. 2 Inhaltsübersicht Nachbesprechung Übung 1 Individuelle Fragen/Bemerkungen.
IT2 – WS 2005/20061Nov 14, 2005 Visibility  public: Sichtbar in allen Paketen  protected: Sichtbar innerhalb des Pakets und in den Unterklassen  (default,
Java Programme nur ein bisschen objektorientiert.
JAVA - Einführung. © Übersicht Hintergrund und Geschichte Wie sieht ein JAVA Programm aus ? Was ist ein JAVA Programm ? Wie schreibt/übersetzt.
 Präsentation transkript:

Daniel Klein Michael Piechullek Messen und Optimieren Benchmarking, Profiling und Tuning von Java Anwendungen Daniel Klein Michael Piechullek 14. Februar 2005

Übersicht Benchmarking Profiling Tuning Strategien Profiling Tools

Benchmarking Übersicht Code-Fragmente, Programmteile oder ganze Anwendungen werden auf bestimmte Kriterien getestet Verschiedene Arten von Benchmarks: Mikrobenchmark, Makrobenchmark In der Regel ist kein gutes Mittelmaß zu finden: Entweder testen Benchmarks einzelne Instruktionen ganz genau oder Anwendungen und/oder Systeme als ein ganzes.

Benchmarking Mikrobenchmarking Wird in der Regel benutzt um die Geschwindigkeit einzelner Instruktionen oder Funktionen zu testen. Eine Instruktion/Funktion wird oft auf Grund der Schnelligkeit viele tausend mal ausgeführt um zuverlässige Ergebnisse erhalten zu können.  Entspricht nicht unbedingt der Praxis. Mögliche Verfälschungen der Messergebnisse auf Grund einer ungenauen Zeitbasis beachten! Zum Beispiel System.getMilliSeconds(): Laufzeit ca. 1/2 ms, also muss der Benchmark mindestens 100 ms laufen um die Messungenauigkeit nur für das abfragen der Zeit auf unter 1% zu drücken. (Besser: Laufzeiten von 1 s und mehr.) Auch liefert System.getMilliSeconds() nicht immer ein aktuelles Ergebnis. Auf manchen Systemen nur ein Update alle 10-50 ms! (Besonders kleinere Mobilgeräte wie Palm PCs oder Mobiltelefone.)

Benchmarking Makrobenchmarking Testet in der Regel Anwendungen als ganzes Ergebnisse sind aber auch Abhängig von Systemfaktoren: Verfügbarer Speicher, VM, Hardware, andere Software die parallel läuft. (Für Tests am besten Zielsystem verwenden.) Makrobenchmarks versuchen automatisiert den Arbeitsablauf des Benutzers zu simulieren. (Möglichst mit reellen Daten.) Laufzeit deutlich länger als bei Mikrobenchmark: Minuten, Stunden oder sogar Tage üblich.

Profiling Übersicht Warum ist die Anwendung langsam? Was tunen? Was messen? Was man nicht messen kann: Empfundene Geschwindigkeit

Profiling Warum ist die Anwendung langsam? Weil sie nicht den Erwartungen entspricht! Lösung: Überprüfen ob die Erwartungen nicht evtl. zu hoch gesteckt sind. (Gerade nicht-Techniker neigen zur Übertreibung.) Vor dem optimieren ein Soll definieren. Optimieren in der richtigen Reihenfolge bis Ziel erreicht ist…

Profiling Was tunen? We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. – Donald Knuth Vorzeitiges oder übertriebenes optimieren macht es nur noch schlimmer.  Überlegen ob Optimierung wirklich Sinn macht. Unwichtiges zu optimieren braucht endlos viel Zeit und bringt so gut wie keine Verbesserungen Stattdessen: Lokalisieren von Stellen an denen die Anwendung Schwachstellen aufweist

Profiling Was tunen? Erster Schritt: Algorithmen (mehr dazu später) Zweiter Schritt: „Glue Logic“ Engpässe („Bottlenecks“) finden. Verbindungen zwischen verschiedenen Modulen können die Software ausbremsen obwohl sie einzelnen schon optimiert worden sind. Dritter Schritt: Feintuning Nur wenn unbedingt nötig! Aufwand > Nutzen Letzte Chance: Hardware tauschen… ;-)

Profiling Was messen? Lässt sich nicht unbedingt pauschal beantworten, jede Anwendung ist anders. Immer sinnvoll: Ausführungsgeschwindigkeit Anzahl der Objekte Speicherverbrauch Anzahl Garbage Collections Je nach Anwendung sinnvoll: Datendurchsatz von/zur Festplatte Datendurchsatz im Netzwerk Anzahl der Netzwerk Pakete und/oder Anfragen Antwortzeit für die bearbeitung einer Anfrage (Server) etc…

Profiling Was man nicht messen kann: Empfundene Geschwindigkeit Eine nicht zu vernachlässigende Komponente, wichtig für alle GUIs. Reagiert die Oberfläche zu langsam macht die gesamte Anwendung für den Bennutzer den Eindruck langsam zu sein. Auch wichtig: Bei längeren Wartezeiten den Benutzer informieren. Problem: Solche Eindrücke sind nur schwer automatisiert zu testen.  Praktische Tests mit Personen durchführen! (Am besten mit der selben Hardware wie später für den Regelbetrieb vorgesehen.)

Tuning Strategien Übersicht Einige übliche Tuningmöglichkeiten: Bessere Algorithmen Objekterzeugung Garbage Collection Methodenaufrufe minimieren

Tuning Strategien Bessere Algorithmen Beste Optimierungschancen Nicht der Code wird optimiert, sondern die Logik Fragen: Ist der verwendete Algorithmus geeignet für die Anforderungen der Anwendung? Gibt es eine schnellere Alternative? Wie viel Zeitaufwand bedeutet die Implementierung einer möglichen Alternative, und wie viel Performanceunterschied könnte Sie bringen?

Tuning Strategien Objekterzeugung Bei neueren VMs kein großes Problem mehr da schnelle O(1) Allokation Trotzdem Erzeugung von übermäßig vielen Objekten vermeiden Zum Beispiel: Objektpools verwenden, nur mit unveränderlichen Klassen arbeiten wenn sinnvoll Das Erzeugen unnötig vieler Objekte, führt zur erhöhter Aktivität des Garbage Collectors

Tuning Strategien Garbage Collection Bei neueren VMs kein großes Problem mehr (da schneller Generational Garbage Collector) Das Einsammeln kurzlebiger Objekte ist schnell Trotzdem Erzeugung von übermäßig vielen Objekten vermeiden

Tuning Strategien Methodenaufrufe minimieren Methodenaufrufe erzeugen einen (wenn auch minimalen) Overhead Durch wiederholtes Aufrufen summiert sich der Overhead jedoch Bei neueren VMs nicht sehr relevant, da HotSpot Compiler via inlining optimieren kann. (In der Regel sogar deutlich besser als der Programmierer.) Aber die Möglichkeiten sind begrenzt: Rekursive Algorithmen, zum Beispiel, lassen sich so nicht bedeutend beschleunigen.

Tuning Strategien Fazit Kleinere Codeoptimierungen lohnen sich durch HotSpot Compiler kaum noch. Bei anderen (einfacheren) VMs weiterhin sinnvoll Generell Ressourcen schonendes Programmieren immer sinnvoll Rules of Optimization: Rule 1: Don’t do it. Rule 2: (for experts only): Don’t do it yet. – M. A. Jackson

Profiling Tools Übersicht Unzählige Tools verfügbar Teilweise sehr teure, kommerzielle Tools, aber auch kostenlose oder Open Source Tools Umfang und Funktionalität der Software oft ziemlich ähnlich Für diese Präsentation: Fokus auf Techniken und Tools die jederzeit zur Verfügung stehen, sowie ein kommerzielles Tool als Beispiel

Profiling Tools Taskmanager

Profiling Tools Manuelles Zeit messen private static final Stack profilingStack= new Stack(); /** * Start profiling by remembering the actual system time. * NOTE: This profiler is NOT able to handle multithreaded usage. */ public static final void startProfiling() { profilingStack.push( new Long(System.currentTimeMillis()) ); } * Stop profiling and return elapsed time. * @return The time elapsed since the call of startProfiling(). public static final long stopProfiling() // first, remember the stop time, to avoid delays long stopTime= System.currentTimeMillis(); // check if there is at least one element left on the stack if( profilingStack.empty() ) throw new java.lang.IllegalStateException( "The count of profiling start and stop doesn't match!" ); // get start value long startTime= ((Long)profilingStack.pop()).longValue(); return stopTime - startTime; Benutzung: profiler.startProfiling(); testMethod() long duration= profiler.stopProfiling(); System.out.println( duration ); Ab Java 5: Genaueres Timing mittels System.nanoTime();

„static“ Zähler in der Klasse zum zählen der Instanzen Profiling Tools „static“ Zähler in der Klasse zum zählen der Instanzen public abstract class InstanceCounter { public static int count; public InstanceCounter() count++; } public void finalize() count--; public class StaticTest extends InstanceCounter { public StaticTest() System.out.println( count ); } public static void main(String[] args ) new StaticTest();

„Verbose“ Ausgabe der VM Profiling Tools „Verbose“ Ausgabe der VM

Xprof Parameter der VM (benutzt JVMPI) Profiling Tools Xprof Parameter der VM (benutzt JVMPI) C:\work\studium\Software Tools WPF>java -Xprof -jar NetFlow.jar Flat profile of 0.36 secs (27 total ticks): main Interpreted + native Method 7.7% 2 + 0 java.util.Hashtable.get 3.8% 0 + 1 sun.awt.windows.WDesktopProperties.init 3.8% 0 + 1 sun.awt.windows.WComponentPeer.pShow 3.8% 0 + 1 java.io.WinNTFileSystem.checkAccess 3.8% 0 + 1 java.util.zip.ZipFile.open 3.8% 0 + 1 java.util.zip.ZipFile.getEntry 3.8% 1 + 0 java.io.ExpiringCache$Entry.<init> 3.8% 1 + 0 java.nio.ByteBufferAsShortBufferB.get 3.8% 1 + 0 java.awt.Insets.<init> 3.8% 1 + 0 sun.java2d.loops.GraphicsPrimitiveMgr$2.compare 3.8% 1 + 0 javax.swing.JRootPane.createLayeredPane 3.8% 1 + 0 java.lang.Class.searchFields 3.8% 1 + 0 java.util.Properties.enumerate 3.8% 1 + 0 java.nio.ByteBuffer.get 3.8% 1 + 0 sun.java2d.loops.GraphicsPrimitiveMgr.register 3.8% 1 + 0 java.lang.ClassLoader.loadClass 3.8% 0 + 1 sun.awt.windows.WDesktopProperties.initIDs 3.8% 1 + 0 sun.font.CompositeFont.getSlotFont 3.8% 1 + 0 javax.swing.JTextField.<init> 3.8% 1 + 0 java.lang.reflect.Method.invoke 3.8% 1 + 0 java.io.Win32FileSystem.normalize 3.8% 1 + 0 java.awt.Component.show 3.8% 1 + 0 sun.nio.ch.IOUtil.readIntoNativeBuffer 3.8% 1 + 0 java.awt.color.ColorSpace.getInstance 3.8% 1 + 0 sun.nio.cs.ISO_8859_1$Decoder.decodeArrayLoop 100.0% 20 + 6 Total interpreted Thread-local ticks: 3.7% 1 Blocked (of total) Flat profile of 36.20 secs (3332 total ticks): AWT-Windows Interpreted + native Method 99.9% 0 + 3329 sun.awt.windows.WToolkit.eventLoop 0.0% 1 + 0 sun.awt.AWTAutoShutdown.isReadyToShutdown 0.0% 1 + 0 java.awt.EventQueue.wakeup 0.0% 0 + 1 sun.awt.windows.WToolkit.init 100.0% 2 + 3330 Total interpreted Flat profile of 35.82 secs (3307 total ticks): DestroyJavaVM 100.0% 3307 Blocked (of total)

Monitoring and Management Extensions (JMX/MX Beans) Profiling Tools Monitoring and Management Extensions (JMX/MX Beans) Neu ab Java 5 Bietet Schnittstelle zum abfragen und setzen von Informationen über die virtuelle Maschine zur Laufzeit. Offene APIs: Java Management Extensions (JSR-003) und JMX Remote API (JSR-160) Monitoring Lokal oder Remote (+ Verschlüsselung) Management Tool(s) direkt bei JDK dabei Via Beans in eigene Anwendung integrierbar Erweiterbar

Monitoring and Management Extensions (JMX/MX Beans) Profiling Tools Monitoring and Management Extensions (JMX/MX Beans) Verfügbare Standard Beans: ClassLoadingMXBean CompilationMXBean GarbageCollectorMXBean MemoryMXBean MemoryManagerMXBean MemoryPoolMXBean OperatingSystemMXBean RuntimeMXBean ThreadMXBean

Profiling Tools JVM Stat (benutzt JMX) C:\Programme\Java\jdk1.5.0_01\bin>jstat.exe -options -class -compiler -gc -gccapacity -gccause -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -gcutil -printcompilation C:\Programme\Java\jdk1.5.0_01\bin>jstat.exe -class 2836 1000 Loaded Bytes Unloaded Bytes Time 30 36,4 0 0,0 0,02 C:\Programme\Java\jdk1.5.0_01\bin>jstat.exe -compiler 2836 1000 Compiled Failed Invalid Time FailedType FailedMethod 50 0 0 0,03 0 C:\Programme\Java\jdk1.5.0_01\bin>jstat.exe -gccapacity 2836 1000 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC 640,0 4992,0 640,0 64,0 64,0 512,0 1408,0 60544,0 1408 ,0 1408,0 8192,0 65536,0 8192,0 8192,0 2 0 C:\Programme\Java\jdk1.5.0_01\bin>jstat.exe -gc 2836 1000 S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT 64,0 64,0 64,0 0,0 512,0 149,4 1408,0 390,1 8192,0 187,9 2 0,014 0 0,000 0,014 C:\Programme\Java\jdk1.5.0_01\bin>jstat.exe -gcnew 2836 1000 S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT 64,0 64,0 64,0 0,0 1 31 32,0 512,0 149,4 2 0,014 C:\Programme\Java\jdk1.5.0_01\bin>jstat.exe -gcutil 2836 1000 S0 S1 E O P YGC YGCT FGC FGCT GCT 100,00 0,00 29,17 27,71 2,29 2 0,014 0 0,000 0,014 C:\Programme\Java\jdk1.5.0_01\bin>jstat.exe -printcompilation 2836 1000 Compiled Size Type Method 50 104 1 java/awt/GradientPaintContext cycleFillRaster 55 111 1 java/util/HashMap get 58 30 1 java/awt/Component inside 84 468 1 sun/java2d/SunGraphics2D getCompClip 86 0 1 java/lang/Object hashCode 90 13 1 java/util/Hashtable isEmpty 102 723 1 java/awt/Toolkit$SelectiveAWTEventListener eventDispatched 135 29 1 java/awt/EventQueue noEvents 145 11 1 java/awt/geom/LineIterator next

JConsole (benutzt JMX) Profiling Tools JConsole (benutzt JMX)

Profiling Tools JConsole

Profiling Tools JConsole

Profiling Tools JConsole

Visual GC (benutzt JMX) Profiling Tools Visual GC (benutzt JMX)

Profiling Tools Borland OptimizeIt

Profiling Tools Borland OptimizeIt

Profiling Tools Borland OptimizeIt

Profiling Tools Borland OptimizeIt

Borland OptimizeIt – Code Coverage Profiling Tools Borland OptimizeIt – Code Coverage

Bücher und Artikel Schreiber, Hendrik: Performant Java Programmieren; Addison-Wesley, 1. Auflage, 2002 (Deutsch) Shirazi, Jack: Java Performance Tuning; O’Reilly, First edition, September 2000 (Englisch) So wie unzählige Artikel im Internet (Qualität und Belegbarkeit oft fraglich)

Vielen Dank für Ihre Aufmerksamkeit !