T
tuxedo
Gast
Hallo zusammen,
nachdem es mich schwer angekotzt hat dass RMI Probleme macht wenn man den Client hinter einem Router hat und unbedingt Callbacks vom Server aus benutzen will (RMI versucht da immer eine Socketverbindung zurück zum Client aufzubauen...), hab ich mich drangesetzt und eine Alternative gebastelt.
Ich hab sie mal "SIMON" getauft.
Simple
Invocation of
Methods
Over
Network
Ich hab viel Diskussionen über die Geschwindigkeit von RMI gelesen. RMI wird meist als langsam bezeichnet. Aber je nach Anwendungszweck ist das mehr oder weniger anders zu betrachten.
Nun, meine erste Alpha von SIMON steht und ich habs mal verglichen mit RMI. Dazu hab ich einen Mini-Test geschrieben.
Sowohl RMI als auch SIMON haben Serverseitig nur eine einzige Methode:
Der Test sieht wie folgt aus:
Ich habe Tests von 16 Byte Array-Größe bis 65535 Byte gemacht. Client und Server liefen auf der gleichen Maschine. Verbunden wurde über Localhost.
Testsetup:
Intel Core2 6420 @ 2,13Ghz
2GB RAM
JAVA 6 Update 3
Tests gestartet aus Eclipse 3.3 heraus
Das Ergebnis hab ich mal grafisch aufgereitet:
Mein SIMON ist ziemlich Konstant was die Ausführungzeit der Test-Methode angeht.
RMI variiert da ein wenig und kitzelt stellenweise mehr Speed raus.
Ein wenig Hintergrundwissen zu SIMON (RMI wird intern auch nicht viel anders funktionieren):
Der Client holt sich vom Server via serialisierung das Interface des Serverobjets. Damit wird lokal ein Proxy gebastelt. Die Methodenaufrufe des Proxys werden abgefangen und an den Server übermittelt (Name des RemoteObjekts, Name des Remot-Methode (jeweils String), Parametertypen und Argumente (jeweils serialisierte Objekte)). Der Server nimmt die Daten entgegen, führt die besagte Methode mit Argumenten aus und liefert das Ergebnis wieder zurück an den Client (ebenfalls wieder serialisiertes Objekt)). Weitere "interna" wurde übrigens hier diskutiert.
So, jetzt meine Fragen an euch:
1) Hattet ihr mit RMI schon mal performanceschwierigkeiten?
2) Für wie aussagekräftig haltet ihr meine Testergebnisse?
3) Hat einer nen Plan warum RMI das ganze unterschiedlich schnell ausführt? Die Methodenaufrufe sind immer wieder gleich und die übertragenen Daten sind immer zufällig. Dennoch schwanken die Anzahl der Methodenaufrufe ziemlich stark (von etwa 900 bis über 9000), wohingegen SIMON da immer konstant bei rund 3000 pro Sekunde bleibt.
Any Ideas?
- Alex
nachdem es mich schwer angekotzt hat dass RMI Probleme macht wenn man den Client hinter einem Router hat und unbedingt Callbacks vom Server aus benutzen will (RMI versucht da immer eine Socketverbindung zurück zum Client aufzubauen...), hab ich mich drangesetzt und eine Alternative gebastelt.
Ich hab sie mal "SIMON" getauft.
Simple
Invocation of
Methods
Over
Network
Ich hab viel Diskussionen über die Geschwindigkeit von RMI gelesen. RMI wird meist als langsam bezeichnet. Aber je nach Anwendungszweck ist das mehr oder weniger anders zu betrachten.
Nun, meine erste Alpha von SIMON steht und ich habs mal verglichen mit RMI. Dazu hab ich einen Mini-Test geschrieben.
Sowohl RMI als auch SIMON haben Serverseitig nur eine einzige Methode:
Code:
public byte[] benchmark(byte[] b)
Der Test sieht wie folgt aus:
Code:
Erstelle X-Byte großes byte[]
befülle das byte[] mit Zufallswerten
Stoppe Zeit (
für 1000mal:
rufe die Methode benchmark auf und übergebe das byte[]
)
Ich habe Tests von 16 Byte Array-Größe bis 65535 Byte gemacht. Client und Server liefen auf der gleichen Maschine. Verbunden wurde über Localhost.
Testsetup:
Intel Core2 6420 @ 2,13Ghz
2GB RAM
JAVA 6 Update 3
Tests gestartet aus Eclipse 3.3 heraus
Das Ergebnis hab ich mal grafisch aufgereitet:

Mein SIMON ist ziemlich Konstant was die Ausführungzeit der Test-Methode angeht.
RMI variiert da ein wenig und kitzelt stellenweise mehr Speed raus.
Ein wenig Hintergrundwissen zu SIMON (RMI wird intern auch nicht viel anders funktionieren):
Der Client holt sich vom Server via serialisierung das Interface des Serverobjets. Damit wird lokal ein Proxy gebastelt. Die Methodenaufrufe des Proxys werden abgefangen und an den Server übermittelt (Name des RemoteObjekts, Name des Remot-Methode (jeweils String), Parametertypen und Argumente (jeweils serialisierte Objekte)). Der Server nimmt die Daten entgegen, führt die besagte Methode mit Argumenten aus und liefert das Ergebnis wieder zurück an den Client (ebenfalls wieder serialisiertes Objekt)). Weitere "interna" wurde übrigens hier diskutiert.
So, jetzt meine Fragen an euch:
1) Hattet ihr mit RMI schon mal performanceschwierigkeiten?
2) Für wie aussagekräftig haltet ihr meine Testergebnisse?
3) Hat einer nen Plan warum RMI das ganze unterschiedlich schnell ausführt? Die Methodenaufrufe sind immer wieder gleich und die übertragenen Daten sind immer zufällig. Dennoch schwanken die Anzahl der Methodenaufrufe ziemlich stark (von etwa 900 bis über 9000), wohingegen SIMON da immer konstant bei rund 3000 pro Sekunde bleibt.
Any Ideas?
- Alex