2012-10-19 14 views
10

Ich beobachte wirklich schlechte Leistung, wenn GWT requestfactory verwendet. Zum Beispiel dauert eine Anfrage, die meine Serviceschicht 2 Sekunden dauert, bis sie erfüllt ist, GWT 20 Sekunden zum Serialisieren. Mein Dienst gibt ~ 100 zurück, was EntityProxies sein wird. Jedes dieser Objekte verfügt über 4 ValueProxies und 2 EntityProxies (100 EntityProxies auf Root-Ebene, 400 ValueProxies und 200 zusätzliche EntityProxies). Ich sehe jedoch die gleiche 10fache Leistungsverschlechterung bei viel kleineren Datensätzen.GWT Requestfactory Leistungsvorschläge

Beispiel log-Schnipsel:

D 2012-10-18 22:42:39.546 ServiceLayerDecorator invoke: Inoking service layer took 2265 ms 
D 2012-10-18 22:42:58.957 RequestFactoryServlet doPost: Entire request took 22870 ms 

Ich habe einige Profilierungs Code dem ServiceLayerDecorator#invoke Methode zugegeben und das gesamte Servlet in einem Zeitgeber gewickelt. Ich habe den Dienst selbst profiliert, und er liefert Ergebnisse in ~ 2s.

Ich verwende GWT 2.4, aber habe dies auf GWT 2.5rc1 und GWT 2.5rc2 getestet. Mein Backend ist auf GAE, aber ich denke nicht, dass das hier eine Rolle spielt.

Ich fand this bug eingereicht gegen 2.4, die sehr ähnlich zu sein scheint. Ich habe den Patch manuell von this google group ohne Glück angewendet.

Meine Domain-Modelle wie folgt aussehen:

class Trip { 
    protected Address origin; // becomes ValueProxy 
    protected Address destination; becomes ValueProxy 
    protected Set<TripPassenger> tripPassengers; // Set of ValueProxies 
} 

class TripPassenger { 
    protected Passenger passenger; 
} 

class Passenger { 
    protected Account account; 
} 

Meine Frage ist:

  • Habe ich den Code richtig profiliert und das Problem auf die GWT Serialisierung isoliert?
  • Könnte ich etwas falsch machen, das dieses Verhalten verursachen würde?
  • Wie kann ich den GWT-Serialisierungscode besser profilieren, um die Ursache herauszufinden?
+0

Ich denke, Sie haben eine zu komplexe Datenstruktur. Versuche es zu reduzieren. Kannst du etwas mehr erklären, wie dein DTO aussieht? Verwenden Sie AutoBean? –

+0

Ich habe der Frage einen Teil des Domänenmodells hinzugefügt. In einigen der teureren ist dies der Graph, der geladen wird. Haben Sie Hinweise darauf, dass die Datenstruktur zu komplex ist? Was ist daran komplex (die Größe oder die Beziehungen)? Für mich scheint es ziemlich vernünftig für jede Geschäftsanwendung. Ich habe begonnen, AutoBean zu betrachten und denke darüber nach, JSON stattdessen vom Server zurückzugeben. – Brad

+0

Ich profilierte gerade eine Anfrage, die ~ 10 EntityProxies (keine ValueProxy oder verschachtelte Assoziationen) lädt. Die Service-Schicht dauerte ~ 1s, aber die GWT-Serialisierung dauerte etwas mehr als 3 Sekunden. – Brad

Antwort

1
  • Habe ich den Code richtig profiliert und das Problem auf die GWT Serialisierung isoliert?

RequestFactory verwendet Reflektion eine ganze Menge (viel mehr als GWT-RPC zum Beispiel), so dass ich nicht wirklich überrascht, dass es einige perf Probleme in einigen Fällen verursacht. Und GAE könnte hier eine Rolle spielen.
Ich glaube, RequestFactory (der AutoBean-Teil tatsächlich) könnte erheblich von der Code-Generierung zur Build-Zeit profitieren.

  • Könnte ich etwas falsch machen, die dieses Verhalten verursachen würde?

Ihre Locators' Prüfen find und/oder isLive Methoden.

  • Wie kann ich das Profil besser die GWT Serialisierungscode zu versuchen, die Ursache herauszufinden?

Es wäre auch interessant sein, die Zeit auf der Deserialisierung des Antrags, die Anwendung Änderungen ausgegeben zu kennen, und dann die Serialisierung der Antwort. Und vergessen Sie nicht, die in find und isLive verbrachte Zeit abzuziehen.

+0

Ich werde in Kürze eine Aufschlüsselung der Zeiten bekommen. Ich verbrachte die meiste Zeit des Wochenendes mit der Profilerstellung meines Codes und eine Sache, die mir auffiel, war, dass Anfragen, die ein Domänenmodell als Argument enthalten, keine teure Serialisierungszeit haben. Zum Beispiel hat 'Trip service.save (Trip t) '~ 100ms Serialisierungszeit. Wohingegen "Trip service.find (String id)" ungefähr 12k ms Serialisierungszeit hat. Gleiche Grafikstrukturen, aber unterschiedliche Kontexte. Außerdem wird meine isLive-Methode ausgegeben, um immer wahr zurückzugeben. – Brad

+0

Interessant. Fühlen Sie sich frei, ein neues Problem im GWT-Tracker mit dem zu öffnen, was Sie beim Profiling Ihrer App herausgefunden haben. Danke im Voraus! –