Tipps für performantes Programmieren

kleinis_1

Mitglied
Hallo,

habt ihr irgendwelche generellen Tipps worauf man beim Programmieren besonders achten sollte um möglichst performant zu sein.

Beziehe die Frage hauptsächlich auf Swing-Programmierung aber auch allgemeine Tipps sind willkommen, z.B. macht es Sinn, wo es möglich ist, Variablen als 'final' zu deklarieren, methoden als static u.s.w ---> wohlgemerkt nur wenn es möglich ist.

Für Tipps wäre ich sehr dankbar
Grüsse
Andi
 
Sry, aber ich glaube da kann dir niemand Helfen. Es kommt nämlich immer auf die Situation an :)
 
Ja, ist mir schon klar, dass es schwierig ist darauf eine gezielte antwort zu geben, hatte nur gehofft jemand kennt vielleicht einen Link wo das Thema behandelt wird.
 
Ich glaub, da bleibt dir fast nichts anderes übrig als Erfahrung zu sammeln. Es ist zwar der längste Weg, und sicher nicht der leichteste, aber ich kenn keinen anderen.

Und jeder noch so lange Weg beginnt mit einem kleinen Schritt (Sorry, aber das musste ich loswerden ;) )
 
Halli und hallo,
Ich habe mal gelesen, dass man z.B. bei Stringverarbeitung möglichst mit StringBuffer arbeiten sollte, da nicht jedesmal teuer Objekte unter der Decke auf und wieder abgebaut werden müssen.
Beispiel hat man viel Zeug zu verketten ist der bequeme Weg
String lala= "dumdu dum "+xyz+" blblbadf" ....;

schneller an der Stelle soll angeblich sein
StringBuffer strBuf = new StringBuffer(); // noch besser hier eine ungefäre
//größe mitzugeben da default lediglich 16 ist
strBuf..append("dumdu dum ").append(xyz).append("blblbadf") ...;

Im 1. Beispiel wird (sofern sich in den neueren Java-Versionen nicht geändert hat) mehere Strings angelegt und zwar nicht nur für die Literale, im zweiten werden nur für die Literale Stringobjekte instanziiert.
Allerding halte ich solche Performance-techniken nur dann für sinnvoll, wenn sich sowas häufiger und vor allem in Schleifen oder Rekursionen abspielt. Ansonsten z.B. ein String der für eine Benutzerausgabe produziert wird ist es vermutlich eher belanglos.

Bei mathematischen Dingen kann es sinnvoll sein wenn man darauf achtet nicht immer wieder dieselben Rechnungen fürs gleiche Ergebnis zu machen sondern dann einfach eine Variable für ein Zwischenergebis verwendet, allerdings ist da nicht Java-spezifisch sondern gilt vermutlich für alle Programmierungen.

Hast Du eine Datenbank-Anwendung ist der Flaschenhals meist eher unglückliche SQL-Statements, fehlende Inezes auf der DB u.s.w.

Bei Datenübertragung, nicht selten bei DB-Anwendungen vor allem bei Multi-Tier-Anwendungen mit tabelarischen Darstellungen hat man oft die Aufgabe viele Daten dem Anwender zur Verfügung zu stellen. Sind es gemein viele (mehere tausen zeilen z.B.) geht das herzlich auf die Performance, undzwar nicht weil das SQL-Statement so lange dauert sondern oft weil sich die Daten durchs Internet quälen müssen. Wenn kopression nicht ausreicht kann ein cashe abhelfend sein, birgt aber auch potentielle Konsistenzprobleme.
eine super gute Art ist es, nur die Daten anzuzeigen, die der Anwender gerade for Augen hat, gängig Praxis bei Web-Seiten (s.Suchmaschinen)
Bei herkömmlichen Swing-Anwendungen hat man leider nicht sonderlich günstiges zur Auswal. Man muss also dem Scroll-Panel beibringen immer nur dann neue Zeilen in das Tabellenmodel zu laden, wenn man unten angekommen ist und noch mehr lesen möchte.
Ist wirklich nicht trivial zu entwickeln, zumal die anfragen an den Server damit gekoppelt sind und der Server die Daten vorhalten müsste. Einproblem dabei wären Multiuseranforderungen, wobei ein einzelner User die Tabelel sicherlich nach seinen wünschen per klick sortieren will. Übernähme das der Client würde immer nur der gerade geladene Datenausschnitt angezeigt werden. Also auch Aufgabe des Servers für den bzw. die Clients die Tabellen zu sortieren. Also Haleluja :p

Die Technikcen mit final funktionen zu arbeiten würde ich nur bei sehr oft z.b. in großen Schleifen verwendeten kleinen Funktionen anwenden und auch nur dann wenn ich weiß dass entweder nur ich meine Programme verwende bzw niemand diese Methoden von der Wahrscheinlichkeit her ableiten braucht. Static Variablen würde ich nur aus programierlogischer Sicht anwenden nicht aus performancetechnischer.

Wenn Du insachen Grafik z.B. Spielegraphik eprformanceverbesserungen anstrebst gibt es da sicher seine absolut eigene Optimierungsstrategien, darauf bin ich nicht so arg Ahnungvoll, ich weiß da nur eines, es hat viel mit Mathematik, speziell bei 3D geschichten, zu tun.

hoffe ein wenig was nutzvolles von mir gegeben zu haben.

Takidoso

PS: für welche Problematik benötigst Du eine Optimierung, bzw wasprogrammierst du oder hast du vor zu programmieren?
 
Hi,

erst mal danke für die grosse Mühe die du dir gemacht hast, steckt ja einiges an Info drin in deinem Artikel.
Also, ich programmiere eine Anwendung die viel auf die Datenbank zugreift, Daten in mehreren Tabellen darstellt und multiuserfähig ist. Da alle User auf dem selben Datenbestand arbeiten muss ich auch viel aktualisieren.
 
Hi,
benutzt Du da ein spezielles Framework um auf die DB zuzugreifen oder machst Du das JDBC native? Ich selbst habe da nur Erfahrung mit dem JDBC 1 mittlerweie gibt es ja schon 2 und 3, die vermutlich einiges komfortabler machen.
Wichtig ist in Sachen Geschwindigkeit da auch das Connection-Handling. Ich habe es mir da sehr einfach gemacht gehabt, indem ich bei jeder Anfrage Connection öffne und schließe, und dass kostet Zeit. Besserer Ansatz ist Connection-pooling. Ich bilde mir ein das es JDBC 2 unterstützt, aber es gibt auch proprietärere Lösungen dazu, also zu diesem Thema solltest Du recherchieren.

Ist es "normale" 2 Tier Architektur, Sprich DB-Server -> Client (kommunizieren die Clients direkt mit dem DB-Server) oder hast Du noch ein oder mehrere Server dazwischen die z.B. einen Web-service bereitstellen (z.B. via Soap oder anderes)

Benuzt Du Swing native oder nimmst Du da auch irgendetwas zusätzliches möglicherweise draufgesetztes (z.B. Borland-Swing-Zeug)?

Das sind Dinge die zur Findungsphase gehören, aber die Wahl der Performance-Strategie mit beeinflussen dürften.

Takidoso
 
Hi,

ich setze schon den dbcp-Connection-Pool von jakarta.apache.org/commons ein, der arbeitet auch im Tomcat, ich hab ihn aber standalone. Die zugangsdaten holt er sich über eine jndi-Datasource welche ich auf meinem System registriert habe.

Ansonsten ist das System eine 2-Tier-Architektur, es arbeitet neben meinem Swing-Client noch ein eigener Thread der für die Aktualisierung der Anzeige meiner Daten zuständig ist , im Hintergrund.

Da das System multiuserfähig ist, arbeiten auf einem zentralen Rechner die Datenbank und einige Serverprozesse welche die Arbeitsaufträge in der dort eingerichteten Dateischnittstelle abarbeiten. Diese Dateischnittstelle ist notwendig weil auch Fremdsystem Arbeitsaufträge erstellen können sollen. Das heißt, es wird eine Kommandodatei in einen Ordner zusammen mit zugehörigen dateien geschrieben und diese dann von den Serverprozessen als Auftrag abgearbeitet.

Bei Swing arbeite ich grundsätzlich nativ und in diesem Fall hauptsächlich mit Tabellen mit eigenem Modell, Renderern u.s.w

Gruss
Andi
 

Neue Beiträge

Zurück