2012-10-19 11 views
10

Sto osservando prestazioni davvero brutte quando si utilizza GWT requestfactory. Ad esempio, una richiesta che richiede il mio livello di servizio 2 secondi a fullfil sta prendendo GWT 20 secondi per serializzare. Il mio servizio restituisce ~ 100 ciò che sarà EntityProxies. Ognuno di questi oggetti ha quello che diventerà 4 ValueProxies e altri 2 EntityProxies (100 EntityProxies di livello root, 400 ValueProxies e 200 EntityProxies aggiuntivi). Tuttavia, vedo lo stesso degrado delle prestazioni 10 volte su dataset molto più piccoli.GWT Suggerimenti sulla prestazione della richiesta

Esempio di registro frammento:

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 

ho aggiunto del codice profiling al metodo ServiceLayerDecorator#invoke e avvolto tutta servlet in un timer. Ho profilato il servizio da solo, e in effetti restituisco risultati in ~ 2s.

Sto usando GWT 2.4, ma ho provato questo su GWT 2.5rc1 e GWT 2.5rc2. Il mio back-end è GAE, ma non penso che stia giocando un ruolo qui.

Ho trovato this bug archiviato contro 2,4, che sembra essere molto correlato. Ho applicato manualmente la patch da this google group senza fortuna.

I miei modelli di dominio assomigliano:

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; 
} 

La mia domanda è:

  • Avere ho fatto il profilo il codice corretto e isolato il problema alla serializzazione GWT?
  • Posso fare qualcosa di sbagliato che potrebbe causare questo comportamento?
  • Come è possibile ottenere un profilo migliore del codice di serializzazione GWT per cercare di individuare la causa?
+0

Penso che tu abbia un datastructure troppo complesso. Cerca di appiattirlo. Puoi spiegare un po 'di più, com'è il tuo DTO? Usi AutoBean? –

+0

Ho aggiunto una parte del modello di dominio alla domanda. In alcuni dei più costosi, questo è il grafico che viene caricato. Hai qualche riferimento per dire che la struttura dei dati è troppo complessa? Che cosa è complesso (dimensioni o relazioni)? Per me, sembra abbastanza ragionevole per qualsiasi applicazione commerciale. Ho iniziato a guardare AutoBean e sto pensando di restituire JSON dal server. – Brad

+0

Ho appena profilato una richiesta che carica fino a 10 EntityProxies (nessun ValueProxy o associazioni nidificate). Il livello di servizio richiedeva ~ 1 s, ma la serializzazione GWT impiegava poco più di 3 secondi. – Brad

risposta

1
  • Avere ho fatto il profilo il codice corretto e isolato il problema alla serializzazione GWT?

RequestFactory utilizza la riflessione un bel po ' (molto più di GWT-RPC per esempio), quindi non sono davvero sorpreso che provoca alcuni problemi di Potenza in alcuni casi. E GAE potrebbe svolgere un ruolo qui.
Credo che RequestFactory (la parte AutoBean in realtà) possa trarre grandi vantaggi dalla generazione del codice in fase di build.

  • Potrei fare qualcosa di sbagliato che potrebbe causare questo comportamento?

Controllare i localizzatori find e/o isLive metodi.

  • Come posso meglio il profilo del codice di serializzazione GWT per cercare di capire la causa?

Sarebbe anche interessante sapere il tempo speso per la deserializzazione della richiesta, l'applicazione delle modifiche, e quindi la serializzazione della risposta. E non dimenticare di sottrarre da quelli il tempo trascorso in find e isLive.

+0

Avrò una scomposizione dei tempi a breve. Ho passato la maggior parte del weekend a profilare il mio codice e una cosa che ho notato è che le richieste che includono un modello di dominio come argomento non hanno un tempo di serializzazione costoso. Ad esempio 'Trip service.save (Trip t)' ha ~ 100ms di tempo di serializzazione. Mentre 'Trip service.find (String id)' ha circa 12k ms di tempo di serializzazione. Stesse strutture grafiche ma diversi contesti. Inoltre, il mio metodo isLive viene cancellato per restituire sempre true. – Brad

+0

Interessante. Sentiti libero di aprire un nuovo problema nel tracker GWT con quello che hai scoperto profilando la tua app. Grazie in anticipo! –