Serialisierung als Performanzkiller

lazydaemon

Grünschnabel
Hallo Freunde.
Ich habe eine Anwendung geschrieben, in der Module mit anderen Modulen über RMI kommunizieren. Beim Senden und Empfangen innerhalb der Module werden die Daten serialisiert und deserialisiert. Nun hab ich bei der Performanzuntersuchung mit TPTP festgestellt, dass bei der Serialisierung der Daten die meiste Zeit verloren geht. Testweise habe ich es mit der JBoss Serialisierung getestet. Dort wird die Performanz aber nur bei großen Daten >1MB besser. Ich brauche jedoch mehr Performanz für kleinere Daten.
Kennt jemand paar Tricks, um da mehr Leistung rauszuholen? Evtl. einige Optimierungen im Serialisierungscode oder eine andere Serialisierungsmöglichkeit?
 
Hallo,

wie sehen denn deine Objekte aus welche du versendest? Verwendest du die Standard Serialisierung? Hast du nicht notwendige Attribute mit transient gekennzeichnet? Versuche eine angepasste Serialisierung (Externalizable) zu verwenden, welche wirklich nur das absolut nötige Daten kodiert. Verwendest du caching am ObjectOutput- / ObjectInputStream? Verwendest du Object caches? Vermeide das mehrfache Übertragen nicht veränderter Objekte (Immutable Objekts machen einem hier das Leben sehr einfach ;-)

Ich weis nicht, ob das mit den aktuellen Java versionen immernoch zutrifft, jedoch war die Serialisierung von primitiven Attributen "früher" schneller als die von Wrapper Attributen.

Geht die Zeit laut deinen Profilingergebnissen während des Serialisierens beim de- /encoden (unmarshalling -> bytes -> Objects / Marshalling -> Objects -> bytes) oder beim versenden übers Netzwerk verloren?

Gruß Tom
 
Danke für die Tipps. Nach genauerer Analyse habe ich herausgefunden, dass in folgender Methode die meiste Zeit verbraten wird:

/**
83 * Reads into an array of bytes at the specified offset using
84 * the received socket primitive.
85 * @param fd the FileDescriptor
86 * @param b the buffer into which the data is read
87 * @param off the start offset of the data
88 * @param len the maximum number of bytes read
89 * @param timeout the read timeout in ms
90 * @return the actual number of bytes read, -1 is
91 * returned when the end of the stream is reached.
92 * @exception IOException If an I/O error has occurred.
93 */
94 private native int socketRead0(FileDescriptor fd,
95 byte b[], int off, int len,
96 int timeout)
97 throws IOException;

Ich glaube, da kann ich nicht mehr viel drehen.
 
Zurück