Estoy trabajando en el proyecto GWT donde estamos utilizando FlexTable para mostrar algunos datos. Sé que probablemente deberíamos usar CellTable ya que tiene un mejor rendimiento, pero FlexTable es más fácil de diseñar (estilo de celdas específicas) y hace que sea más fácil actualizar una celda específica.GWT FlexTable rendimiento y optimización
Para recibir actualizaciones para la tabla que estamos usando WebSockets. El problema al que nos enfrentamos en este momento es una gran carga de CPU cuando hay más de 100 actualizaciones por segundo que llegan a través de WebSockets. Cada mensaje de la conexión WebSocket contiene actualizaciones para varias celdas en la tabla. Entonces, en la práctica, hay más de 100 actualizaciones por segundo que deberían presentarse en la FlexTable. La carga de la CPU en mi 3GHz i5 con 4 GB de RAM es de alrededor del 50%. Si deshabilito la representación real de los datos (comentar las llamadas al método setText()), la carga de la CPU baja al 5-10%. Entonces sé que las actualizaciones DOM son el cuello de botella, no las otras partes del código.
¿Sería mejor a
- uso de la red en lugar interruptor
- a CellTable (pero cómo hacer cambios celulares chamusquina a continuación)?
- utilización JS/JSNI trabajar con DOM en lugar de FlexTable setText()
¿Hay mejores maneras de implementar mesa y mejorar el rendimiento?
He intentado con google si alguien tuvo problemas similares con FlexTable, pero encontré solo la opinión general de que solo es lento, nada específico. Tenemos prototipo de aplicación realiza exclusivamente en JavaScript y con los mismos 100 actualizaciones por segundo carga de la CPU es de alrededor de 15%
actualización
Dejar caer efecto de fundido css y que usamos para indicar un cambio en la carga de la CPU valor de la celda reducida por ~ 10 % Entonces parece que el DOM no es el único problema.
La actualización real de la celda se realiza dentro de SchedulerImpl.get(). ScheduleDeferred() pero eso no ayuda mucho. Aunque mantiene el navegador más receptivo. Usar SchedulerImpl.get(). ScheduleIncremental() no funcionaría porque la cantidad de datos que obtenemos puede variar. Hasta ahora parece que deberíamos probar Grid o implementar Table nosotros mismos. – dimchez
Incremental es, de lejos, mucho mejor que diferido en este caso. Diferido usará un nuevo temporizador js por operación, mientras que incremental combinará varias actualizaciones en una sola pila de ejecución de js, lo que dará como resultado un redibujado de una sola página, permitiendo que el subproceso de representación también realice operaciones en lote. – Ajax