Performanceverlust beim Schreiben von ResultSet in txt Datei

E

Elizafa

Gast
Hallo erstmal!

Ich tüftel zur Zeit an nem kleinen Programm um regelmäßig Abfragen durch Datenbanken zu jagen... (Fehlerhafte Datensätze ausfindig machen)
Das Ergebnis stell ich zur zeit in einfachen html Tabellen dar - was an sich keinerlei Probleme bereitet ABER ich bemerke starke Performanceverluste...
Derzeit bau ich mir ja einen sehr langen String zusammen der immer wieder in den Arbeitsspeicher gelegt wird....(siehe Code)
Hat vielleicht jemand eine Idee wie man das Umgehen könnte? Und zum Beispiel eine Datei in Echtzeit schreiben kann? Irgendwie steh ich da etwas auf dem Schlauch :/ Vielleicht gibt es ja auch noch ganz andere Ansätze die das Problem geschickt umgehen?



Innerhalb dieser Schleifen entstehen bei zunehmender Stringlänge extreme Performanceverluste..


Java:
while (result.next()){
    		htmlCode = htmlCode + "\n \t <tr> \n \t \t <td> \n \t \t" + id + "\n \t \t </td> \n \t \t <td>";
    		int i = 1;
    		while(i<=spalten){
    		            if (i==spalten)
    		            htmlCode = htmlCode + "\t \t" + result.getString(i) + "\n \t \t </td> \n";
    		            else
    		            htmlCode = htmlCode + " \t \t" + result.getString(i) + "\n \t \t </td> \n \t \t <td> \n";
    		            i++;
    		}

    	}
    result.close();
    htmlCode = htmlCode + htmlend;
 

nrg

Top Contributor
nimm einen StringBuilder. Strings sind in java immutable, d.h. bei Stringverkettungen werden immer neue Objekte erzeugt (diese werden auch nie durch den GC bereinigt, weil sie durch den StringPool permanent referenziert werden!)
 
E

Elizafa

Gast
Danke nrg!
Hab es direkt mal umgeschrieben und siehe da - kein Performanceverlust mehr :)
 
S

SlaterB

Gast
nimm einen StringBuilder. Strings sind in java immutable, d.h. bei Stringverkettungen werden immer neue Objekte erzeugt (diese werden auch nie durch den GC bereinigt, weil sie durch den StringPool permanent referenziert werden!)
hast du eine Begründung für das mit dem Stringpool + GC? klingt nicht glaubwürdig,
Strings werden doch alle Nase lang in Programmen erzeugt,
das wäre doch ein bekannter Exitus in jedem länger laufenden Prozess

edit:
dass die Erzeugung unnötige Arbeit ist und mit StringBuilder besser wird stimmt natürlich fraglos,
allein dass bei solch schlechten Schleifen Minuten gearbeitet wird zeigt schon die gute Arbeit des GC,
den Speicher vollzumüllen schafft man in Sekunden, damit es ewig weiterläuft müssen die alten Strings alle weichen
 
Zuletzt bearbeitet von einem Moderator:

nrg

Top Contributor
hast du eine Begründung für das mit dem Stringpool + GC? klingt nicht glaubwürdig,
Strings werden doch alle Nase lang in Programmen erzeugt,
das wäre doch ein bekannter Exitus in jedem länger laufenden Prozess

Also auf Literale trifft das auf jedenfall zu (StringLiteralPool). Bei Verkettungen müsste das afaik der StringConstantPool sein und somit dort ebenfalls zutreffen (ohne das jetzt nochmal irgendwo nachgelesen zu haben - grad wenig zeit)

Hatte hier mal einen Thread dazu:
http://www.java-forum.org/allgemeine-java-themen/118286-speicherbereinigung-pool.html
 
S

SlaterB

Gast
du hast dort zwar auch durch Schleifen verkettete Strings angesprochen, aber das ging eher unter, wurde nie direkt kommentiert,

gecachte Literale sind ganz klar im Quellcode stehende Strings "hallo" und meinetwegen auch direkte Zusammensetzungen "hal"+"lo",
das als "hallo" zu interpretieren, so schlau ist der Compiler noch, all das kann geklärt werden bevor das Programm überhaupt läuft,

aber alles was erst zur Laufzeit passiert, das kommt standardmäßig nicht in den internen Pool,
sondern auf den Heap wie im anderen Thema auch diverse Male erwähnt,

dass == stattt equals nicht funktioniert ist ein weitere Hinweis gegen den Pool, für eigene Objekte
 
Zuletzt bearbeitet von einem Moderator:
I

irgendjemand

Gast
es würde sogar NOCH einfacher gehen ...

in dem man sich einen PrintStream nimmt *natürlich mit unterliegendem FileOutputStream um dierekt in die datei zu schreiben* und dann jede zeile direkt in die datei schreibt ... ansatt sich erst einen langen string zusammenzubauen und diesen dann auf einmal in das file zu schreiben ...
würde zumindest die performance noch steigern ...
 
S

SlaterB

Gast
kommt drauf an wie geschrieben wird, direkt in einen FileWriter mit einer Festplattenoperation pro Zeile wäre nicht gut,
schneller als das verrückte String + String aber natürlich allemal

mit einem BufferedWriter wie ihn ein PrintStream trotz schlechter Benennung intern auch verwendet wird gecacht,
recht ähnlich dem StringBuilder, aber nur auf bestimmte Größe beschränkt,
ja das kann man letztlich doch als effektiver ansehen ;)
 
I

irgendjemand

Gast
hmm .. mir ist jetzt PrintStream nur in den sinn gekommen da dieser *zumindest was sockets angeht wo ich diesen stream hauptsächlich verwende* die daten dierekt an den unterliegenden OutputStream *welcher form und implementierung auch immer* weiterreicht ...

das es rein theoretisch nicht gerade "günstig" ist da bei schlechter implementierung jedesmal dierekt bis zur platte weitergeleitet wird und dadurch natürlich viele zugriff und damit verbunden auch fragmentierung entstehen ... ja .. is mir bewusst und sehe ich ja auch ein ... aber sollte dennoch eine der "performanteren" arten sein ...

das man natürlich mit einem gewissen cache arbeiten sollte um gerade die plattenzugriffe und die fragmentierung in den griff zu bekommen sehe ich persönlich auch als "schöner" an ... aber ich denke das es TO hier vor allem auf den hohen performance verlust beim zusammenbauen des String ankam als auf die hardware-auslastung =D
 
S

SlaterB

Gast
String + String geht gar nicht, soweit ganz klar, aber wenn hier schon Performance Thema ist dann kann man wirklich erwähnen,
dass im Arbeitsspeicher zusammensetzen besser ist als mit vielen Dateizugriffen
(unter Abwägung aller Details, etwa dass der Gesamtstring aus dem Arbeitsspeicher irgendwann ja auch in die Datei muss, vielleicht wieder neu gestückelt..)
 
B

...ButAlive

Gast
String + String geht gar nicht, soweit ganz klar

So pauschal kann man das nicht sagen.

Java:
String test = "Hello"+ " " + "World"+"!";

Wird kompiliert zu:

Java:
StringBuilder tmp = new StringBuilder();
tmp.append("Hello");
tmp.append(" ");
tmp.append("World");
tmp.append("!");
String test = tmp.toString();

Soweit noch kein wirkliches Problem. Das würde man per Hand mit einem StringBuilder auch so hinschreiben. Das Problem fängt erst bei Schleifen an, denn

Java:
String[] array = {"Hello"," ","World","!"};
String result = "";
for(String s : array){
   result += s;
}

wird kompiliert zu:

Java:
String[] array = {"Hello"," ","World","!"};
String result = "";
for(String s : array){
   StringBuilder tmp = new StringBuilder(result);
   tmp,append(s);
   result = tmp.toString();
}

Wenn man das per Hand schreibt kommt ungefähr sowas raus:
Java:
String[] array = {"Hello"," ","World","!"};
StringBuilder tmp = new StringBuilder(result);

for(String s : array){
   tmp,append(s);
}

String result = tmp.toString();

Der +-Operator bei Strings würde in Schleifen, bei jedem Durchlauf, ein neues StringBuilder-Objekt anlegen und darauf toString aufrufen. Das ist nicht wirklich nötig und sollte vermieden werden.

Also der +Operator ist außerhalb von Schleifen total ok und sollte im Sinne der Lesbarkeit verwendet werden.

Wird der String in einer Schleife zusammengebaut sollte auf den +Operator verzichtet werden.

Um den Bogen wieder zurück zum ursprünglichen Thema zu spannen, die Lösung in den BufferedWriter zu schreiben ist die Beste, denn der BufferedWriter kennt die optimale Puffergröße (das was im Arbeitspeicher gehalten werden kann und die Größe der Blöcke im Filesystem).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
B Stringmanipulationen beim Dateinamen Allgemeine Java-Themen 8
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
J Mein Frame friert ein beim Uploaden Allgemeine Java-Themen 4
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
A Hilfe beim Verständnis Allgemeine Java-Themen 16
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
U Fehler beim Compillieren Allgemeine Java-Themen 13
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
bueseb84 Fehler beim Import von Maven Dependencies aus lokalem artifactory Allgemeine Java-Themen 2
J Jasper Report - seltame Meldung beim compilieren Allgemeine Java-Themen 3
J Linux .jar beim Start automatisch ausführen Allgemeine Java-Themen 6
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
J WARNING: An illegal reflective access operation has occurred, beim Compilieren von JasperReports, was bedeutet das ? Allgemeine Java-Themen 23
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
S Seitenausrichtung beim Drucken Allgemeine Java-Themen 1
RalleYTN Brauche Hilfe beim Run-Length-Decoding Allgemeine Java-Themen 9
R Optimierung beim Vergleichen von 2 Bildern Allgemeine Java-Themen 23
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
M Beim Öffnen Dialog Directory und Filetype definieren Allgemeine Java-Themen 2
G Problem beim GUI Allgemeine Java-Themen 9
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
J Konstruktor in JSP beim Kompilieren nicht gefunden Allgemeine Java-Themen 3
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
U Swing Hilfe beim Quellcode für ein Codierungs-/Decodierungsprogramm Allgemeine Java-Themen 9
Fischkralle Beim Clean Coden an den Schnittstellen geschnitten. Allgemeine Java-Themen 10
H Beim Konstruktor "this" Allgemeine Java-Themen 4
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
Thallius Swing Merkwürdiges Verhalten beim Panel Tausch Allgemeine Java-Themen 3
Tacofan Sound beim öffnen der GUI Allgemeine Java-Themen 8
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
B Endlosschleife beim Verteilen von Objekten Allgemeine Java-Themen 4
V JavaFX Fehler beim Starten einer Jar Allgemeine Java-Themen 7
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
J JDK installieren Das Jdk funtioniert beim Editor nicht. Allgemeine Java-Themen 3
R Verdrückt beim Sicherheitshinweis Allgemeine Java-Themen 2
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
javampir Input/Output Effizienz beim binären Lesen einer Datei Allgemeine Java-Themen 6
javampir Seltsame Lücken beim Abspielen von Sound Allgemeine Java-Themen 2
RalleYTN JAnsi Warum bleiben die Hintergrundfarben beim Reseten der Konsole? Allgemeine Java-Themen 0
T BufferedImage verändert sich beim Einlsesen Allgemeine Java-Themen 1
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
S Verständnisproblem beim Mocking Allgemeine Java-Themen 8
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
Athena Programm funktioniert nur beim Debugging korrekt, sonst nicht. Allgemeine Java-Themen 1
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
K Fehler beim erstellen von .jar Datei Allgemeine Java-Themen 3
M Eclipse Fehler beim Installieren des Plugins "Jigloo" Allgemeine Java-Themen 12
A Eclipse - Fehler beim "RUN" - "Unable to Launch - The selection cannot be launched" Allgemeine Java-Themen 6
G StackoverflowError beim laden einer FXMML Datei Allgemeine Java-Themen 1
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
D Selenium WebDriver HtmlUnitDriver Problem beim Automatisieren Allgemeine Java-Themen 1
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
D Input/Output Zeilen werden "ignoriert" beim Einlesen aus einer Textdatei Allgemeine Java-Themen 3
L Suchvorschläge beim eingeben einzelner Buchstaben Allgemeine Java-Themen 3
B Compiler-Fehler NullPointerException beim Auslesen von .lang-Datei Allgemeine Java-Themen 3
U Eclipse Java Programm beschädigt .tar.gz dateien beim Entpacken Allgemeine Java-Themen 7
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
reibi Classpath Classpath Variable beim Tomcat Allgemeine Java-Themen 2
H JUnit Fehler beim Compilieren - erledigt Allgemeine Java-Themen 0
J Fehler beim parsens eine Datums Allgemeine Java-Themen 3
A Java - Beim Abspeichern Redundanzen vermeiden! Allgemeine Java-Themen 6
L einfache Verzinsung mit for-Schleife & Ausschluss von Werten beim Einlesen Allgemeine Java-Themen 5
C Bufferoverflow beim eigenen simpeln Programm Allgemeine Java-Themen 4
MiMa Umlaute beim Einlesen von Dateinamen Allgemeine Java-Themen 12
G Fehler beim instanzieren einer Generischen Klasse Allgemeine Java-Themen 5
K Eclipse Fehler beim Ausführen meines Programms in Eclipse Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben