2010-11-26 5 views
5

Nuestra aplicación en el trabajo utiliza el marco ExtJS (Sencha) para la interfaz de usuario. El problema que tengo con el marco es la cantidad de HTML que genera el marco.Métodos para reducir el número de cálculos CSS en la página web

He notado que las áreas del sistema que los usuarios informan que son lentas tienen una tonelada de llamadas de cálculo de CSS. Medí esto en Speedtracer de Google y algunas páginas tardan 8 segundos en cargarse. El 80% del tiempo se dedica exclusivamente a cálculos de CSS. Antes de tratar de alterar la forma en que funciona el framework, ¿hay alguna forma de retrasar el cálculo CSS de una página, o se hacen estos cálculos cuando se renderizan los objetos?

He estado buscando maneras de hacer esto, y tal vez mi "google-fu" es terrible, pero no he encontrado nada concreto sobre cómo lograr algo como esto.

EDITAR: Después de hablar un colega, me señaló en la dirección de llamar a .suspendEvents() en la grilla antes de cargar cualquier dato y .resumeEvents() luego, esto solo ha ahorrado 300ms de tiempo de carga: O Esto está reduciendo el número de llamadas .getStyle detectadas por Firebug. Todavía estoy por probar esta diferencia con Google SpeedTracer

+0

No estoy seguro Entiendo su pregunta. Pero, por lo general, CSS no mantiene la representación de la página. Usted mencionó que el problema es la cantidad de salida de HTML y cálculo de CSS por ExtJS. Supongo que el problema sigue siendo causado por el renderizado de JS. Tal vez puedas probar Firebug o Fiddler para rastrear solicitudes para encontrar el cuello de botella – tshao

+0

de acuerdo. No hay cantidad de CSS en el mundo que tome 8 segundos para calcular a menos que se ejecute en un télex o algo así. Me gustaría saber más sobre cómo lo estás probando. –

+0

si pudiera cargar los resultados de SpeedTracer, quizás deba intentar hacer una captura de pantalla. SpeedTracer es diferente a Firebug en que realmente muestra cuando la UI es utilizable y cuando no lo es. Firebug y Fiddler muestran el tiempo que lleva descargar la respuesta del servidor. – StevenMcD

Respuesta

3

Es difícil decir cuál es la causa de su problema de rendimiento sin saber exactamente lo que su aplicación se está haciendo. CSS tendrá algún impacto but not much, es más probable que algunos JavaScript en su aplicación sean causing excessive reflows mientras la página está en proceso.

Resumen del artículo de stubornella (el segundo enlace)

de reflujo es el proceso por el cual los elementos de una página web Cómo dispuestas de acuerdo con las reglas de estilo. Un reflujo es computacionalmente costoso, pero normalmente es posible dibujar una página HTML estática en un solo reflujo siempre que la representación de cualquier elemento posterior no afecte a los elementos que ya se han dibujado. Cosas que puedan dar lugar a múltiples reflujos y algunos arounds de trabajo:

  1. dinámicamente agregar clases CSS a los elementos - las clases cambian tan bajas en el árbol DOM como sea posible para limitar el impacto
  2. Añadir varios elementos DOM - cree una estructura invisible y agregarlo en una sola operación en lugar
  3. Adición de múltiples estilos en línea a los elementos visibles - mejor crear una clase con todos los estilos, a continuación, aplicar la clase
  4. aplicar animaciones a los elementos posicionados relativamente - mejor para animar position: fixed o position: absolute elementos como t no afectará a ninguna otra parte
  5. Animaciones de grano fino: mover un elemento 3px a la vez puede ser más suave que moverlo 1px a la vez porque evita dos reflujos
  6. Las tablas son uno de los pocos casos donde la representación de un elemento más tarde en el DOM puede cambiar la forma de un elemento anterior se dictarán - si tiene que usar tablas, utilice table-layout: fixed
+0

Leyendo el artículo sobre reflows ahora y esto parece prometedor, gracias. EDIT: Estoy bastante seguro de que esto es exactamente lo que está sucediendo. El mejor consejo que veo en el artículo es evitar el uso de tablas para el diseño, lamentablemente el marco de Javascript en uso hace exactamente eso. – StevenMcD

+0

Robert: ¿Podría editar su respuesta para expandir los reflows para que los usuarios no necesiten seguir el enlace y lo aceptaré como respuesta? Gracias amigo – StevenMcD

0

Smartoptimizer es realmente increíble, ¿has probado alguno de esos tipos de herramientas de compresión de código gzip?

https://github.com/farhadi/SmartOptimizer

+0

no se trata de tamaño, se trata de número de objetos DOM y número de reglas css. La compresión generalmente se asocia con un procesamiento más lento. – AlexanderMP

+0

Como dice Alexander, en este caso ya está comprimido, el problema es el número de objetos DOM y el tiempo que le lleva al navegador calcular las reglas asignadas a cada objeto dom y procesarlo – StevenMcD

2

también hemos estado luchando con el añadido del uso de extJS - aunque el marco es muy amplia, el golpe de rendimiento (especialmente con IE6) ha sido una gran limitación.Éstos son algunos de los pasos que dimos para optimizar el marco:

  1. Streamline la biblioteca para incluir sólo los paquetes que se utilizan en su sitio. Esto significa personalizar el archivo jsb2 y desplegar su propia implementación de extJS.
  2. En nuestras pruebas de rendimiento identificamos al CSS como el mayor delincuente. Una ventaja de usar una compilación personalizada de extJS es la reducción de los selectores CSS no utilizados. Para optimizar aún más el CSS, usamos Google Page Page para identificar los selectores CSS ineficientes para refactorizarlos/eliminarlos. Prestar especial atención a:
    • Pseudo : hover selector de
    • Universal * llave con selectores de descendientes

Los ext "light" debería producir importantes mejoras de rendimiento resultantes, en particular en IE6. Aunque el equipo de Secha está realizando continuas mejoras de rendimiento en cada versión, la sobrecarga de cargar todo el marco es demasiado cara como para ignorarla.

Espero que esto ayude ...

Cuestiones relacionadas