2010-05-02 10 views
5

C'è un modo per accelerare la popolazione di una pagina con gli elementi dell'interfaccia utente di GWT generati dai dati caricati dal datastore? Posso evitare di effettuare la chiamata RPC non necessaria quando viene caricata la pagina?GWT: il popolamento di una pagina dal datastore tramite RPC è troppo lento

Ulteriori dettagli sul problema che sto riscontrando: C'è una pagina in cui viene generata una tabella con nomi e pulsanti per un elenco di entità caricate dal datastore. C'è un EntryPoint per la pagina e nella sua onModuleLoad() che faccio qualcosa di simile:

final FlexTable table = new FlexTable(); 

rpcAsyncService.getAllCandidates(new AsyncCallback<List<Candidate>>() { 
    public void onSuccess(List<Candidate> candidates) { 
     int row = 0; 
     for (Candidate person : candidates) { 
      table.setText(row, 0, person.getName()); 
      table.setWidget(row, 1, new ToggleButton("Yes")); 
      table.setWidget(row, 2, new ToggleButton("No")); 
      row++; 
     } 
    } 
    ... 
}); 

Questo funziona, ma richiede più di 30 secondi per caricare la pagina con pulsanti per 300 candidati. Questo è inaccettabile.

L'app è in esecuzione su Google App Engine e utilizza il datastore del motore dell'app.

risposta

8

Si potrebbe fare un sacco di cose, li elenco solo per ottenere il migliore impatto.

  1. FlexTable non è stato progettato per 300 righe. Dal momento che la tua tabella è così semplice, dovresti prendere in considerazione la generazione dell'HTML a mano e quindi utilizzare un semplice widget HTML. Inoltre, 300 righe sono un sacco di informazioni - considerare l'uso dell'impaginazione. Il DynaTable sample app mostra come fare questo.
  2. Sembra che tu stia utilizzando un modulo GWT per pagina. Questo è l'approccio sbagliato per GWT. Il caricamento di un modulo GWT ha alcuni costi non banali. Per capire cosa intendo, confronta l'aggiornamento del browser su gmail v/s il link di aggiornamento fornito da gmail. Questo è lo stesso costo che paghi quando ogni pagina del tuo sito web ha un modulo GWT distinto.
  3. Se l'elenco di candidati è necessario attraverso le viste, è possibile inviarlo insieme all'HTML come oggetto JSON, quindi utilizzare lo Dictionary class in GWT per leggerlo. Questo ti risparmia la chiamata RPC che stai facendo. Questo approccio è consigliato solo se i dati saranno utili su più viste/schermate (come le informazioni sugli utenti registrati)
  4. Controllare per quanto tempo sta prendendo la chiamata al metodo RPC. È possibile abilitare stats in GWT per capire dove la vostra applicazione richiede tempo.
  5. È anche possibile eseguire Speed Tracer per identificare dove si trova il collo di bottiglia. Questo è ultimo solo perché è ovvio che FlexTable sta eseguendo molte manipolazioni DOM. In generale, se non sai da dove iniziare, Speed ​​Tracer è un ottimo strumento.
1

La cosa importante qui è come si sta recuperando la lista dei candidati, che non hai mostrato. 30 secondi è estremamente alto, ed è improbabile che sia dovuto al solo datastore.

Hai provato a utilizzare appstats per profilare la tua app?

1

Come sri suggested - impaginazione è semplice e (credo) soluzione migliore (insieme con il passaggio a Grid o semplicemente <table>). Ma nel caso in cui tu volessi per qualche motivo mostrare/eseguire il rendering di molte righe contemporaneamente, lo ha a nice wiki page - insieme ad alcuni benchmark che mostrano come FlexTable fa schifo con un grande numero di righe. Dai un'occhiata anche al loro other tables;)

1

Il tuo problema è che ogni volta che aggiungi qualcosa alla FlexTable deve re-renderizzare l'intera pagina e ridisegnarla. Prova a creare una nuova FlexTable, popolandola, quando è completamente popolata, sbarazzati di quella vecchia e inseriscila nella nuova.