Performance Tips

Civilazi

Bekanntes Mitglied
Hallo ihr,

Performance ist mir teilweise extrem wichtig.

Kennt jemand ein Buch / Webseite mit Tips zu performantem Programmieren? Beispielsweise habe ich mir sagen lassen, dass der Punkt-Operator teuer ist und wenn ich mehrmals an eine Objektvariable ranwill, ich die dann zwischenspeichern sollte (stimmt das?).
Also kein Optimieren auf der Algorithmenebene, sondern schon tiefer.
Ich möchte mir kein Profiling sparen, sondern habe gedacht, dass es evtl. schon während des Implementierens eben performante und nicht so performante Wege gibt, Dinge zu erledigen. Ich verfolge natürlich trotzdem das Ziel, gut lesbaren Code zu schreiben.

Gibt es solche Tips oder war das nur früher mal aktuell und man sollte die VM einfach machen lassen oder wie sieht es hier aus? :)

Vielen Dank für eure Mithilfe.
 
N

nillehammer

Gast
Du beziehst Dich in Deiner Frage ja explizit auf Code. Da empfehle ich das Buch "Effective Java 2nd Edition" von Joshua Bloch. Da wird sehr genau auf guten Code eingegangen, der die von Dir angesprochenen Fehler vermeidet. Darüber hinaus dann noch "Clean-Code" von Robert C. Martin. Das ist zwar nicht nur auf Java gemünzt und nähert sich umfassender dem Thema, aber "Clean-Code" hat meistens auch eine bessere Performance. Beide Bücher sind meiner Meinung nach Pflichtlektüre!

Im Prinzip kann man bei Performance auf Code-Ebene sagen: "Vermeide alles, was unnötig ist." Da Du als Programmierer weißt, wie der Ablauf Deines Programmes sein soll, siehst Du auch selbst, wo das der Fall sein könnte. Ansätze:
- Unnötige Objekterzeugung
- Ungünstig verschachtelte/ mehrfach dürchgeführte Überprüfung von Bedingungen
- String-Konkatenierung mittels des '+'-Operators
- "Schlechte" Objekterzeugung (z.B. new Integer(1), obwohl es die statische Factorymethode valueOf gibt)
- "Schlechte" Algorithmen

Ansonsten kommt es auf die eingesetzte Technologie an. Es gibt halt effiziente Arten, z.B. Abfragen an eine DB zu senden und auch sehr ineffiziente. Wenn Du den Bereich noch eingrenzen könntest, gibts vielleicht noch mehr Empfehlungen.
 

Timothy Truckle

Top Contributor
Performance ist mir teilweise extrem wichtig.
Sehr löblich

Kennt jemand ein Buch / Webseite mit Tips zu performantem Programmieren?
Effective Java: A Programming Language Guide (Java Series): Amazon.de: Joshua Bloch: Englische Bücher ist wohl immernoch eine gute wahl.
Beispielsweise habe ich mir sagen lassen, dass der Punkt-Operator teuer ist und wenn ich mehrmals an eine Objektvariable ranwill, ich die dann zwischenspeichern sollte (stimmt das?).
Falsch.
Ich meine nicht den Fakt (das weis ich gar nicht) sondern die Herangehensweise.
Lesbarkeit des Codes hat erstmal Vorrang. Optimierungen auf diesem Niveau werden erst dann (auf kosten der Lesbarkeit) gemacht, wenn dies nachweislich Ursache des Flaschenhalses war. (üblicher Weise ist es das nicht).

Problematisch ist der häufige Zugriff auf Variablen fremder Objekte trotzdem: es ist idR. ein Verstoß gegen die OO-Prinzipien...

Also kein Optimieren auf der Algorithmenebene, sondern schon tiefer.
Aber optimierung des Algorithmus wird immer mehr bringen, als der JVM mal einen Sprung zu ersparen...

Ich möchte mir kein Profiling sparen, sondern habe gedacht, dass es evtl. schon während des Implementierens eben performante und nicht so performante Wege gibt, Dinge zu erledigen.
Nutze die richtigen Klassen der API z.B.: [JAPI]StringBuilder[/JAPI] zum Zusammenbau von Texten in Schleifen, [JAPI]ArrayList[/JAPI] oder [JAPI]Hashset[/JAPI] statt [STRIKE][JAPI]Vector[/JAPI][/STRIKE]...

Ich verfolge natürlich trotzdem das Ziel, gut lesbaren Code zu schreiben.
Gibt es solche Tips oder war das nur früher mal aktuell und man sollte die VM einfach machen lassen oder wie sieht es hier aus? :)
Im wesentlichen heist die Devise: Vermeide unnötige Schleifen und an sonsten lass die Hotspot-VM ihren Job machen.

bye
TT
 

Civilazi

Bekanntes Mitglied
Vielen Dank für die Buchtips, werde ich mir auf jeden Fall anschauen.

Der Hintergrund meiner Frage ist der, dass es um die Implementierung von schon vorhandenen Algorithmen geht - z.B. bei mir aktuell der Ford-Fulkerson zur Bestimmung eines minimalen Schnittes in einem Netzwerk. Das heißt, der Algo ist "fertig", Aufwand in O-Notation steht fest, außerdem ist klar, wie er funktioniert. Daran soll auch nichts geändert werden.
Er muss eben "nur" noch schnell sein, durchaus auch auf Kosten der Lesbarkeit, auch wenn ich es immer noch objektorientiert haben möchte.

Daher die Frage nach solch low-lvl-Techniken. Kennt da jemand mehr? Oder sogar Bibliotheken mit schnelleren Collections o.ä.?
Mit der normalen API kenn ich mich mittlerweile ganz gut aus. Trotzdem danke auch für die Tips.
 

tfa

Top Contributor
- Unnötige Objekterzeugung
Vorsicht mit diesem Tipp. Unnötige Objekterzeugungsvermeidung (z.B. durch überflüssiges Objekt-Pooling) kann schädlich sein für die GC-Performance. Viele sehr kurzlebige Objekte zu erzeugen (in minimalem Scope) ist recht billig.

- String-Konkatenierung mittels des '+'-Operators
Wenn diese in einer Schleife stattfinden. Sonst ist nichts dagegen einzuwenden.
 
N

nillehammer

Gast
Der Hintergrund meiner Frage ist der, dass es um die Implementierung von schon vorhandenen Algorithmen geht - z.B. bei mir aktuell der Ford-Fulkerson zur Bestimmung eines minimalen Schnittes in einem Netzwerk. Das heißt, der Algo ist "fertig", Aufwand in O-Notation steht fest, außerdem ist klar, wie er funktioniert. Daran soll auch nichts geändert werden.
Er muss eben "nur" noch schnell sein, durchaus auch auf Kosten der Lesbarkeit, auch wenn ich es immer noch objektorientiert haben möchte.
Ich kenne den Algorithmus leider nicht. Aber, da Du anscheinend schon Code hast, kannst Du diesen Posten? Kann man ja mal drüber schauen, ob er unnötige Schleifendurchläufe, Methodenaufrufe, Objekterzeugung oder sowas enthält.
 
N

nillehammer

Gast
tfa hat gesagt.:
Vorsicht mit diesem Tipp. Unnötige Objekterzeugungsvermeidung (z.B. durch überflüssiges Objekt-Pooling) kann schädlich sein für die GC-Performance. Viele sehr kurzlebige Objekte zu erzeugen (in minimalem Scope) ist recht billig.
Wollte den Tipp auch nicht als Plädoyer für Pools verstanden wissen. Ich dachte da z.B. an annonyme Implementiereungen von Listenern/Comparatoren o.ä. Es gibt viel Code (auch viele Beispiele im Internet), wo innerhalb einer Methode new Comparator {...}, new xyzListener{...} etc. mit entspr. Implementierung der Methoden gemacht wird. D.h. es wird hier bei jedem Aufruf der Methode ein neues Objekt erzeugt, dass genau das gleiche macht, wie die zig Objekte vorher. Obwohl man es auch ein einziges Mal erzeugen und irgendwo hinlegen könnte, um es immer wieder zu verwenden.
tfa hat gesagt.:
[..]Zu Stringkonkatenierung mit +:
Wenn diese in einer Schleife stattfinden. Sonst ist nichts dagegen einzuwenden.
Echt? Das wäre mal tatsächlich was Neues für mich. Die beiden folgenden Zeilen wären performancemäßig also äquivalient?
Java:
public String buildKeyValueOutput(String keyName, String value) {

 // + -Operator
 return keyName + "=" + value;

 // oder doch besser StringBuilder
 return new StringBuilder().append(keyName).append("=").append(value).toString();
}
 
Zuletzt bearbeitet von einem Moderator:

tfa

Top Contributor
Echt? Das wäre mal tatsächlich was Neues für mich. Die beiden folgenden Zeilen wären performancemäßig also äquivalient?
Richtig. Der Compiler wandelt die Stringkonkatenation in nichts anderes als StringBuilder.append-Aufrufe um.

Diese Methoden
Java:
	public String concat(String keyName, String value) {
		return keyName+"="+value;
	}

	public String builder(String keyName, String value) {
		return new StringBuilder().append(keyName).append("=").append(value).toString();
	}
ergeben diesen Bytecode:

Code:
public java.lang.String concat(java.lang.String keyName, java.lang.String value);
     0  new java.lang.StringBuilder [16]
     3  dup
     4  aload_1 [keyName]
     5  invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [18]
     8  invokespecial java.lang.StringBuilder(java.lang.String) [24]
    11  ldc <String "="> [27]
    13  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [29]
    16  aload_2 [value]
    17  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [29]
    20  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33]
    23  areturn      
  
  // Method descriptor #15 (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
  // Stack: 2, Locals: 3
  public java.lang.String builder(java.lang.String keyName, java.lang.String value);
     0  new java.lang.StringBuilder [16]
     3  dup
     4  invokespecial java.lang.StringBuilder() [41]
     7  aload_1 [keyName]
     8  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [29]
    11  ldc <String "="> [27]
    13  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [29]
    16  aload_2 [value]
    17  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [29]
    20  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33]
    23  areturn
 
N

nillehammer

Gast
Richtig. Der Compiler wandelt die Stringkonkatenation in nichts anderes als StringBuilder.append-Aufrufe um.
Das wusste ich. Ich dachte nur, dass er für jedes '+' einen neuen erzeugt. Das hast du mit Deinem Bytecode ja eindrucksvoll widerlegt. Kann leider nur einmal "Danke" klicken ;)
 

Civilazi

Bekanntes Mitglied
Ich kenne den Algorithmus leider nicht. Aber, da Du anscheinend schon Code hast, kannst Du diesen Posten? Kann man ja mal drüber schauen, ob er unnötige Schleifendurchläufe, Methodenaufrufe, Objekterzeugung oder sowas enthält.

Sehr gern morgen, wenn ich wieder in der Uni bin. Das Ziel ist aber nicht nur, diesen Code schnell zu bekommen, sondern auch allgemeine Richtlinien / Wissen zu haben. Davon scheinen die empfohlenen Bücher viel zu bieten :)
 

Civilazi

Bekanntes Mitglied
"premature optimization is the root of all evil" - Donald Knuth.

... hilfreich...

Nichtsdestotrotz gab es hier schon gute Tips, ich lade nachher gern Beispielcode hoch. Ich möchte mich wie gesagt nicht ums Profiling drücken, sondern einfach best practices für performanten Code kennenlernen.
 

Bleiglanz

Gesperrter Benutzer
Meine Tipps:

1) Das Buch von Bloch
2) Lernen was in Java NICHT zu erhöhter Performance führt obwohl es so aussieht
3) Standardtechniken verwenden, z.B. Loop unrolling ? Wikipedia und andere

und

zuerst mit einem korrekten, eleganten Programm anfangen; Performance bei 'kleinen Problemen' analysieren und erst dann mit einem Profiler prüfen, wann/wo bei 'großen Problemen' überhaupt Performanceprobleme auftauchen.

Auf keinen Fall im Vorfeld wild 'ins Blaue' irgendwelche abstrusen Optimierungen machen, die möglicherweise überhaupt nichts bringen. Ist Zeitverschwending.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
H Watson-Crick-Complement Performance Allgemeine Java-Themen 18
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
B Performance Messungen Allgemeine Java-Themen 4
J Threads verbessern die Performance NICHT ? Allgemeine Java-Themen 8
X Performance für Tomcat / Apache optimieren Allgemeine Java-Themen 2
I Performance - JDBC UPC PoolDataSoure Allgemeine Java-Themen 0
E Lambda filter performance Allgemeine Java-Themen 2
D Performance-Probleme mit Joda-Time Allgemeine Java-Themen 3
A Jasper Report Performance bei PDF erzeugen Allgemeine Java-Themen 0
A Best Practice Variablen vertauschen - Performance Allgemeine Java-Themen 1
R DBUnit Performance Probleme Allgemeine Java-Themen 0
P Performance: super explizit erwähnen oder weglassen? Allgemeine Java-Themen 5
S starke performance probleme des forums Allgemeine Java-Themen 10
A Performance/Speicherplatz-Nutzung bei Tests Allgemeine Java-Themen 6
R Java Performance testen Allgemeine Java-Themen 18
StrikeTom Java Performance Fragen Allgemeine Java-Themen 5
V Performance steigern Allgemeine Java-Themen 7
D Reflection-Performance Allgemeine Java-Themen 7
M Einfluss von Caching auf die Performance (große Arrays) Allgemeine Java-Themen 24
R Collections Performance einer HashMap Allgemeine Java-Themen 26
i<3java [Groovy/Grails](oder auch java) Mögliche Performance Probleme bei Mailversendung Allgemeine Java-Themen 2
D Performance Objektallokation Allgemeine Java-Themen 28
J Java Performance nicht nachvollziehbar Allgemeine Java-Themen 3
I Library für High Performance Mime Type Erkennung Allgemeine Java-Themen 8
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
M Runtime.exec() - Performance / Frage zu Threads Allgemeine Java-Themen 5
M Performance Allgemeine Java-Themen 6
M Performance Allgemeine Java-Themen 5
E Performance website download Allgemeine Java-Themen 13
MQue Performance Methodenaufruf - if Abfrage Allgemeine Java-Themen 19
hdi Was frisst in meinem Programm den Speicher / verschlechtert die Performance Allgemeine Java-Themen 11
J Performance von Java GUI-Anwendungen Allgemeine Java-Themen 2
U Java Performance im Vergleich zu C++ in speziellem Anwendungsfall Allgemeine Java-Themen 6
S Performance und Function Call Depth Allgemeine Java-Themen 6
H Performance Vorteil durch Wechsel der JVM? Allgemeine Java-Themen 6
A Performance: byte[] in byte[][][] konvertieren Allgemeine Java-Themen 2
T Performance ArrayList#remove Allgemeine Java-Themen 8
ARadauer Performance Pptimierung -Lesen/Schreiben Allgemeine Java-Themen 10
Chris81T Performance Problem durch mehrfaches Starten eines JAVA Prog Allgemeine Java-Themen 8
G Hibernate, JTable und Performance Allgemeine Java-Themen 17
M Listener und Performance Allgemeine Java-Themen 9
P Performance: Ziehen ohne Zurücklegen (große Datenmenge) Allgemeine Java-Themen 10
D Performance: ArrayList vs. Array vs. "Eigene Liste&quot Allgemeine Java-Themen 8
M nichtreferenzierte Objekte auf NULL setzen -> Performance Allgemeine Java-Themen 4
S Ursache für schlechte Performance Allgemeine Java-Themen 2
L Java Performance Check Tool Allgemeine Java-Themen 3
S Performance von Comparator Allgemeine Java-Themen 3
egrath Performance Problem mit File-I/O Allgemeine Java-Themen 6
S Performance Problem Allgemeine Java-Themen 11
X Java Performance auf Sun Systemen bzw. generell Allgemeine Java-Themen 4
T Performance String-Operationen und StringBuffer (1.4und 1.5) Allgemeine Java-Themen 18
P miese performance bei nem BufferedImage + repaint :( Allgemeine Java-Themen 6
T Performance-Grundlagen Allgemeine Java-Themen 4
G Performance Problem bei der Übertragung Server zum Client Allgemeine Java-Themen 3
V Performance Leck finden Allgemeine Java-Themen 3
T Tile Game Performance Allgemeine Java-Themen 32
M Performance enorm langsam Allgemeine Java-Themen 26
F Performance von Reflection vs Statisches Coden Allgemeine Java-Themen 4
M Performance: Java zu C/C++ bei Datenbankanwendung Allgemeine Java-Themen 3
Y unnecessary cast & Performance Allgemeine Java-Themen 29
conan2 Performance von paint() Allgemeine Java-Themen 2
G Performance JDOM - DOM - eigene HashMap (SAX) Allgemeine Java-Themen 2
F Bilder als "Thumbnails" laden - Performance Allgemeine Java-Themen 6
S Java3D Performance optimieren Allgemeine Java-Themen 5
F Wenn ihr Performance wollt nehmt C++ Allgemeine Java-Themen 39
N Performance-Test (Geschwindigkeit von Methoden vergleichen)? Allgemeine Java-Themen 4
S Performance Test mit JMeter Allgemeine Java-Themen 2
T Performance Allgemeine Java-Themen 8
J Anfängerliste für gute Performance? Allgemeine Java-Themen 3
Luma Performance-Problem mit RandomAcces File Allgemeine Java-Themen 4
I Performance bei "String <-> Byte"-Umwandlung Allgemeine Java-Themen 4
I Performance-Probleme bei Schleife Allgemeine Java-Themen 3
C Performance von FOR Schleifen Allgemeine Java-Themen 25
C Performance Vergleich, Java vs. Tcl/Tk Allgemeine Java-Themen 3
I Swing GUI / Webapp..... benötige ein paar Tips / Ratschläge Allgemeine Java-Themen 18
L Tips für JavaGuru Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben