2011-01-05 13 views
12

actualizaciónmejorar el rendimiento plantilla jQuery

Al parecer, las plantillas jQuery puede ser compilado y se mejora el rendimiento para las plantillas con si las declaraciones mostrado here.

Pero como se muestra en here, las plantillas jQuery precompiladas no hacen mucho para mi caso ya que mi plantilla no contiene ningún bloque lógico.

Para aquellos que están sugiriendo el uso de otro motor de plantillas, idealmente me gustaría usar solo plantillas de jQuery ya que todos en el equipo solo conocen jQuery. También hay this caso de prueba que compara unas pocas plantillas de motor.


Hola,

Hoy mismo me dijeron que hay problemas de rendimiento con el uso de plantillas jQuery.

Para comparar, he usado las plantillas de jQuery y el buen método de agregar cadenas para agregar filas a una tabla. Los resultados se pueden ver here. El uso de plantillas jQuery es aproximadamente un 65% más lento en comparación con el método de anexión de cadenas, ¡Ay!

Me pregunto qué se puede hacer para mejorar el rendimiento de la secuencia de comandos de la plantilla jQuery.

El guión completo se puede ver en el enlace proporcionado. Pero la idea básica es la siguiente:

Plantilla:

<script type="x-jquery-tmpl" id="tmplRow"> 
<tr> 
    <td><input type="checkbox" value="${id}" /></td> 
    <td>${firstName} ${lastName}</td> 
    <td class="edit"> 
     <a>Edit</a> 
     <input style="display:none;" type="hidden" value="Blah" /> 
     <input class="cancel" type="button" value="cancel" /> 
    </td> 
    <td class="select"> 
     <a>Select</a> 
     <select style="display:none;"> 
      <option>0</option> 
      <option>1</option> 
      <option>2</option> 
      <option>3</option> 
      <option>4</option> 
      <option>5</option> 
      <option>6</option> 
      <option>7</option> 
      <option>8</option> 
      <option>9</option> 
      <option>10</option> 
     </select> 
     <input class="cancel" type="button" value="cancel" /> 
    </td> 
    <td>More string</td> 
    <td>More string</td> 
    <td>More string</td> 
    <td>More string</td> 
    <td>More string</td> 
    <td>More string</td> 
</tr> 
</script> 

datos:

<script type="text/javascript"> 
    var data = []; 

    for (var i = 0; i < 100; i++) { 
     var row = { 
      id: i, 
      firstName: 'john', 
      lastName: 'doe' 
     }; 

     data.push(row); 
    } 
</script> 

HTML:

<table id="table"></table> 

Ejecuta:

<script type="text/javascript"> 
$('#tmplRow').tmpl(data).appendTo('#table'); 
</script> 

Gracias,

Chi

Respuesta

0

Su plantilla es muy simple, es posible que desee take a look at handlebars.js que es un lenguaje de plantillas que tiene la opción de precompilar las plantillas.

Está hecho por los carriles y el miembro de jquery core Yehuda Katz.

+0

no me importa de revisar manillar. Pero su descarga no funciona. si hago referencia solo a "handlebars.js" desde el código fuente, se producirá un error con el método "requerido" no definido. ¿Tienes una copia del archivo js sentado? –

+0

jquery templates 'compila' las plantillas también ... – user406905

+0

Aparentemente, las plantillas de 'compilación' solo ayudan si hay bloques de control lógico. Por favor revise la pregunta actualizada para más detalles. –

4

Este parece ser el motor más rápido en este momento: http://documentcloud.github.com/underscore/

se puede encontrar un conjunto de pruebas de evaluación comparativa aquí que compara los diferentes marcos de plantillas disponibles en la actualidad: https://github.com/aefxx/jQote2 [descargar y ejecutar jqote.benchmark.htm].

Creo que las plantillas de jQuery están en su infancia y el rendimiento mejorará en las iteraciones posteriores.

+0

Creo que esta es la respuesta más cercana ... básicamente, espere a que la plantilla de jQuery mejore el rendimiento en el futuro. Por ahora, intentaré no depender demasiado de eso. –

+0

y si necesita obtener velocidad máxima, use guión bajo. está más cerca de Javascript nativo. por supuesto, tienes que cambiar/modificar un poco tus plantillas jQuery (más si usas loops/lógica condicional y otras cosas complejas). Lo bueno es que, a pesar de la falta de documentación elaborada, todavía puede administrar todo eso y, en algunos casos, es más fácil que hacerlo de una manera jQuery. – Mrchief

1

Depende mucho del navegador que realiza la representación.IE6 puede ser bastante lento (aunque la transferencia de 1.000 filas grandes de marcado HTML e inyectar eso en el documento tampoco va a ser rápido).

He aquí una jsperf benchmark that generates 1,000 rows of 10 columns and renders it. I'm averaging 200-250ms to render los 1.000 filas en Chrome 9.

La pregunta más importante debería ser: ¿Por qué en el mundo que está visualizando 1.000 filas a la vez? Siempre hay mejores alternativas UX que eso.

+0

No estamos tratando de hacer 1000 filas, sino 100 filas. 100 filas no es tan malo :). Quiero probar rápidamente el rendimiento de la creación de plantillas porque estamos buscando construir una grilla interactiva donde cada muestra resultados diferentes según los datos. Habrá mucha más lógica de plantillas y luego se agregarán filas de curso. La prueba escrita es solo una forma de ver si el rendimiento puede ser un problema en el futuro. –

+0

Creé una nueva prueba de creación de HTML RAW y las velocidades que obtengo parecen ser más rápidas que la plantilla de jQuery. http://jsperf.com/jquery-templates-performance/4 - Plantilla jQuery (1.2sec), HTML sin formato (0.2 seg)! Gran diferencia –

+0

Si va a copiar/pegar la respuesta de otra persona, al menos bríndeles crédito. http://stackoverflow.com/questions/4590718/jquery-templates-performance/4590790#4590790 –

5

Chi Chan,

un poco tarde en el camino con éste. Descubrí que compilar las plantillas primero y luego hacer referencia a ellas con un ID de cadena (en el caso siguiente, la variable denominada templateAlias) es en realidad 10 veces más rápido que pasar por la ruta del objeto. Aquí te mostramos cómo lograr que (basado en el código de ejemplo):

var templateAlias = 'tmplRow'; 
// compile the template 
$.template(templateAlias, $("#tmplRow")); 

<script type="text/javascript"> 
    $.tmpl(templateAlias, data).appendTo('#table'); 
</script> 

esto debería acelerar significativamente procedings Como habrá sido compilado la plantilla y no se utiliza todo el modelo de objetos cada vez que se ejecuta el .appendTo() función. El uso de $('#tmplRow').tmpl(data).appendTo('#table'); significa que $('#tmplRow') consulta el DOM, mientras que $.tmpl(templateAlias, data).appendTo('#table'); solo agrega al DOM según la referencia a la plantilla. hay bastante lectura sobre el tema.

Aquí hay un enlace que puede ayudar:

http://boedesign.com/misc/presentation-jquery-tmpl/#13

esperanza que esto ayude, buena suerte ...

+0

¡Hola Jim! Gracias por su aporte :) Su presentación es increíble. Todavía estoy muy molesto por la cosa compilada de la plantilla.No sé lo que hace en segundo plano, pero parece que una plantilla compilada solo marcaría la diferencia si hay bloques condicionales en la plantilla. Escribí una prueba para eso, eché un vistazo al bloque "Actualizar" en la pregunta. ¿Extraño eh? –

+0

Chi - intente "conectar" mi código anterior en su prueba como una segunda actualización y vea cuál es la diferencia. Creo que los números bajarán en un buen 60-70% ... –

+0

Creo que su prueba de rendimiento es defectuosa. Tal vez no haga la diferencia, pero ejecutaría la segunda declaración "$ .tmpl" una vez sin medir y * luego * la ejecutaría 1000 veces para ver qué tan rápido es. El método puede estar haciendo una optimización detrás de escena la primera vez que se ejecuta. Al menos, eso espero. En resumen, las segundas 1000 ejecuciones incluyen cualquier posible optimización que se está realizando en la ejecución n. ° 1. –

Cuestiones relacionadas