ObjectOutputStream#writeObject() zu langsam.

Status
Nicht offen für weitere Antworten.
T

tuxedo

Gast
Kennt jemand ne Methode um ein beliebiges Objekt anders zu serialisieren als mit "ObjectOutputStream#writeObject()"?

Nach zahlreichen Profiler-Versuchen hat sich rausgestellt dass das das Haupt-Bottleneck meines SIMON-Projekts ist...
Nur hab ich noch keine Idee wie ich's besser machen kann.

- Alex
 

tfa

Top Contributor
Du könntest mit java.io.Externalizable, java.io_ObjectOutput und java.io_ObjectInput alles selber implementieren. Keine Ahnung, ob man damit viel rausholen kann. Hab ich noch nie eingesetzt.
 
T

tuxedo

Gast
@André

Was soll ich mit ner Datenbank? Es geht um Socketkommunikation zwischen Client und Server.

@tfa
Ja, das hab ich jetzt nahc einiger Zeit googeln auch rausgefunden. Ich frag mich nur wie RMI das schneller hinkriegt. Als ich letztes mal im Source von RMI geschaut hatte, hab ich, wenn ich ich recht entsinne, gesehen dass die nicht einfach auf alles und jeden writeObject loslassen. Die schauen was für eine Art Objekt das ist und serialisieren dann entsprechend auf "einfacherer" ebene. ein byte[] als Objekt zu serialisieren ist ja nicht so der Bringer. Gleiches gilt für die Primitiven Typen wie Integer, oder auch andere Sachen wie String. Da lässt sich vllt. mehr rauskitzeln wenn man das anders behandelt. Aber bei Objektgeflechten die ganze Abhängigkeitsbäume haben, wird das nicht gehen. Und ich glaube fast nicht dass sich Object*Stream so viel besser implementieren lässt was solche aufwendigen Objekte betrifft.

Das "seltsame" ist:

Ich transportiere keinen primitiven Datentyp oder nur nen String. Auch kein reines byte[].

Ich hab mir ein Transport-Objekt gebastelt das eine ID in Form eines Strings enthält und ein byte[] das die Daten darstellt.

Auch RMI müsste dieses Objekt als "nicht-String" und "nicht-Integer" erkennen und als "komplexes Objekt" behandeln und somit "normal" mit readObject und writeObject serialisieren.
Würde ich nur ein byte[] transferieren, so würde mir's mittlerweile einleuchten. Aber so.... hmmpf.

Da Simon und RMI dann eigentlich die gleichen Techniken verwenden ist es "sonderbar" dass RMI Anhand meiner vorliegenden Zahlen dennoch schneller ist.

Und als eindeutiges Bottleneck hab ich eindeutig die write und readObject Methode identifiziert.

Jetzt stehe ich vor einem Rätsel...

- Alex
 
T

tuxedo

Gast
Will keine Grundsatzdiskussionanfangen. Aber auch ohne zu wissen was "SIMON" ist war die Frage klar: Gibt einen schnelleren weg als writeObject() ...

Zu tfa's Vorschlag mit Externalizable ...
Es soll für beliebige Objekte gehen. Externalizable setzt vorraus dass die Objekte für's serialisieren "speziell" aufbereitet sind.

Bin gerade dabei zu schauen wie ich Objekte selbst analysieren kann. Klar, geht mit Reflection. Aber da bin ich gerade auf ein Problem gestoßen:

Was mach ich mit Instanzvariablen welche "private" sind? Da komm ich scheinbar nicht ohne weiteres dran. Dennoch sind diese Felder wichtig für die verwendung des deserialisierten Objekts.

In diversen RMI-Dokus hab ich gelesen dass dort auch private Felder ausgelesen und gesetzt werden können.
Ist jemand in Relfection so fit und kann mich da auch den richtigen Trichter bzgl. der privaten Felder bringen?

-Alex

[update]

Ein

Code:
field.setAccessible(true);
brachte das gewünschte Ergebnis ;-)
 
S

SlaterB

Gast
meine Güte, Simon schreiben aber nicht mal Reflection-API lesen? ;)

Code:
public class Test
{

    private String test = "auto";

    public static void main(String[] args)
        throws Exception
    {
        Test t = new Test();
        Field f = t.getClass().getDeclaredField("test");
        System.out.println(f.get(t));
    }

}

> Da komm ich scheinbar nicht ohne weiteres dran.

wie kommst du denn sonst ran, suchst du nach getter/ setter?

edit: ok, bei anderen Klassen als der eigenen ist es schwieriger ;) ich lese ja auch nicht
 
T

tuxedo

Gast
@SlaterB
Es ging um "private" Fields... An public war's kein Thema. Bei private jetzt aber auch nicht mehr.

@André
Naja, sind wir hier nicht im Perfomance-Board? Ach, ich vergaß.. Wird ja abgeschafft. Beim nächsten "Gibt einen schnelleren weg als writeObject() ..." Problem frag ich dann dort nach. Versprochen ;-)
 

Illuvatar

Top Contributor
Hmm... bist du eigentlich sicher, dass das Serialisieren das langsame ist? Oder könnte evtl. die Netzwerkverbindung noch besser ausgenutzt werden? Aus dem Profiling-Test den du gepostet hast schien es für mich, dass das nicht klar hervorgeht. Vielleicht solltest du mal was mit Channels probieren, die sind stark Performance-opimiert.
 

Janus

Bekanntes Mitglied
ich stimm illuvator da mal zu. reflection ist zwar "langsam", aber in relation zu socket streams ist das ne rakete. wenn die profiling ergebnisse wirklich stimmen, kann ich mir nur vorstellen, dass du beim serialisieren irgendwas ungeschicktes anstellst.

um mal ein beispiel aufzuzeigen: ich hatte mal einen sehr kruden parser für formatierten text gestrickt und eclipse profiling tools haben mir angezeigt, dass der code ca. 60% der zeit in diesem parser verbringt. also hab ich den optimiert, bis der neue parser um faktor 100 schneller war als der alte. trotzdem hat sich die performance der lib nur um sehr wenige prozent erhöht.

der grund war zweigestaltig: der profiler hatte die hohe cpu last während des parsens als kritisch eingestuft. tatsächlich ging 60% der last für das parsen drauf und ein verschwindend geringer lastanteil (< 1%) für die anschließende datenbankverbindung. allerdings machte der laufzeitanteil der DB verbindung über 90% aus.
die optimierung des parsers hat also höchstens mein gewissen beruhigt, aber kaum nen vorteil gebracht ;)
 

angelchr

Mitglied
hi,
also ich hatte vor kurzem ein ähnliches Problem mit der Geschwindigkeit. Bei mir ging es um ein Spiel. Ich hatte die Geschwindigkeitsprobleme NUR zwischen 2 Windows Clients. 2 Linux Clients haben das problemlos bewältigt. Ich hab mich dann für eine Lösung ohne Serialisierung entschieden. Das gleiche Problem!!!
Socket.setTcpNoDelay(true); brachte mir die erforderliche Geschwindigtkeit. Ich hab es nicht mehr mit serialisierung probiert, allerdings gehe ich davon aus, dass es funktioniert hätte.


Gruß

Angelchr
 
T

tuxedo

Gast
Also den Nagle-Algo hab ich schon abgeschaltet (setTcpNoDelay(true)).

Ich benutze immer RMI als vergleich. RMI nutzt auch "reine" Socketverbindungen und kein Java.NIO. Von daher muss ich das doch genauso schnell hinbekommen.

Die Socketeinstellungen (Nagle und Puffer und Co.) sind bei Simon schon seit längerem 1:1 gleich mit RMI.

RMI benutzt auch das serialisieren. Und dennoch ist es schneller.
Dass es am Netzwerkdevice liegt schließe ich mal aus.
Zum einen teste ich mit localhost, und zum anderen lasse ich 1:1 den gleichen Test auf 1:1 der gleichen Maschine mit RMI laufen.

Ich werd jetzt versuchen irgendwie anders zu serialisieren, bzw. das Profiling weiter auszuweiten. Hab ja den Source von allem (hab das JDK-Source Paket runtergeladen).

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
Seikuassi Input/Output ObjectOutputStream putFields-Problem Allgemeine Java-Themen 2
P ObjectOutputStream oder ObjectInputStream fehlerhaft? Allgemeine Java-Themen 7
B ObjectOutputStream verzeichnis wählen Allgemeine Java-Themen 8
G ObjectOutputStream Allgemeine Java-Themen 15
S ObjectOutputStream / objekte anhängen Allgemeine Java-Themen 2
S ObjectOutputStream Allgemeine Java-Themen 12
R ObjectOutputStream Allgemeine Java-Themen 5
T ObjectOutputStream => Socket versenden Allgemeine Java-Themen 2
S ObjectOutputStream Allgemeine Java-Themen 2
U ObjectOutputStream Allgemeine Java-Themen 14
R JDK installieren OpenJDK-Aufruf sehr langsam Allgemeine Java-Themen 4
K Arbeitsspeicher wird langsam voll Allgemeine Java-Themen 6
E JavaFX RMI extrem langsam wenn Server nicht läuft Allgemeine Java-Themen 5
Thallius String erzeugen sehr langsam Allgemeine Java-Themen 16
S JNLP startet seit 1.8.0_31 sehr langsam + Windows-Systemverzeichnis Allgemeine Java-Themen 3
P Eclipse langsam/unbrauchbar bei größeren Quelldateien? Allgemeine Java-Themen 8
W Threads NullPointer: Konstruktor "zu langsam"? Allgemeine Java-Themen 3
M Externe Jar sehr langsam Allgemeine Java-Themen 23
C JEditorPane langsam großes HTML Allgemeine Java-Themen 8
J Laden von JAR Files geht ohne ADMIN Rechte sehr langsam Allgemeine Java-Themen 6
H Kopieren sehr langsam Allgemeine Java-Themen 5
B Cipher.getInstance Aufruf sehr langsam Allgemeine Java-Themen 2
B util.Timer zu langsam? Allgemeine Java-Themen 3
W Java Applet läuft langsam Allgemeine Java-Themen 2
N Liste mit Map abgleichen extrem langsam Allgemeine Java-Themen 6
C Darstellung der Liste bei vielen Daten extrem langsam Allgemeine Java-Themen 11
B JavaPanels langsam schliessen und öffne Allgemeine Java-Themen 6
L Java Debugmodus ist unerträglich langsam! Allgemeine Java-Themen 30
L Java 1.5 - Anwendung unter 1.6 JRE sehr langsam geworden Allgemeine Java-Themen 8
H JID3 + vdheide schreiben zu langsam Allgemeine Java-Themen 11
M String zusammensetzen->sehr langsam Allgemeine Java-Themen 3
N Berechnungsthreads zu langsam. Allgemeine Java-Themen 2
G Java Socket langsam unter Linux Allgemeine Java-Themen 21
T String.split() - viel zu langsam Allgemeine Java-Themen 9
T [SVNKit] Commit sehr langsam. Allgemeine Java-Themen 7
W sin und cos bei hohen Werten extrem langsam Allgemeine Java-Themen 12
G Domainen crawlen & Domainnamen listen -> LANGSAM! Allgemeine Java-Themen 19
M Performance enorm langsam Allgemeine Java-Themen 26
H java.util.Vector langsam ? Allgemeine Java-Themen 5
T Jtree zu langsam beim klappen Allgemeine Java-Themen 8
F JAVA Applikationen starten sehr langsam Allgemeine Java-Themen 14
D Datei öffnung sehr langsam Allgemeine Java-Themen 17
H Verschlüsselungsprogramm zu langsam Allgemeine Java-Themen 12
G Neue Warenwirtschaft aber sehr langsam! Allgemeine Java-Themen 3
T Bilder bearbeiten unglaublich langsam Allgemeine Java-Themen 9
H Entpacken sehr langsam Allgemeine Java-Themen 10
C Thread zu langsam ==> kann doch nicht sein oder? Allgemeine Java-Themen 9
R Double Buffering zu langsam Allgemeine Java-Themen 11
D ganze packete importieren --> langsam? Allgemeine Java-Themen 9
G Funktion, die langsam wächst Allgemeine Java-Themen 7

Ähnliche Java Themen


Oben