Sto lavorando al progetto GWT in cui stiamo utilizzando FlexTable per visualizzare alcuni dati. So che probabilmente dovremmo usare CellTable in quanto ha prestazioni migliori, ma FlexTable è più facile da stile (celle con stile specifico) e rende più semplice l'aggiornamento di celle specifiche.GWT FlexTable prestazioni e ottimizzazione
Per ricevere gli aggiornamenti per la tabella, stiamo utilizzando WebSockets. Il problema che stiamo affrontando in questo momento è un elevato carico della CPU quando ci sono più di 100 aggiornamenti al secondo provenienti da WebSockets. Ogni messaggio dalla connessione WebSocket contiene aggiornamenti per diverse celle nella tabella. Quindi nella pratica ci sono più di 100 aggiornamenti al secondo che dovrebbero essere resi nella FlexTable. Il carico della CPU sul mio 3GHz i5 con 4 GB di RAM è di circa il 50%. Se disattivo il rendering effettivo dei dati (commenta le chiamate al metodo setText()), il carico della CPU scende al 5-10%. Quindi so che gli aggiornamenti DOM sono il collo di bottiglia, non le altre parti del codice.
sarebbe meglio
- uso Griglia invece
- interruttore per CellTable (ma come fare aggiornamenti cellulari singe poi)?
- uso JS/JSNI di lavorare con DOM invece di FlexTable setText()
ci sono modi migliori per attuare tavolo e migliorare le prestazioni?
Ho provato a google se qualcuno ha avuto problemi simili con FlexTable, ma ho trovato solo l'opinione generale che è solo lento, niente di specifico. Abbiamo prototipo applicazione fatto puramente in JavaScript e con le stesse 100 aggiornamenti al carico seconda CPU è circa il 15%
Aggiornamento
Dropping effetto di dissolvenza css che abbiamo usato per indicare il cambiamento del carico della CPU valore della cella ridotto di ~ 10 %. Quindi sembra che il DOM non sia l'unico problema.
L'aggiornamento effettivo della cella viene eseguito all'interno di SchedulerImpl.get(). ScheduleDeferred() ma ciò non aiuta molto. Anche se mantiene il browser più reattivo. L'utilizzo di SchedulerImpl.get(). ScheduleIncremental() non funzionerebbe perché la quantità di dati che otteniamo può variare. Finora sembra che dovremmo provare Grid o implementare Table noi stessi. – dimchez
Incrementale è, di gran lunga, molto meglio di rinviato in questo caso. Deferred utilizzerà un nuovo timer js per operazione, mentre incremental metterà in batch più aggiornamenti in un singolo stack di esecuzione js, dando come risultato un ridisegno di una singola pagina, consentendo al thread di rendering di eseguire anche operazioni in batch. – Ajax