2011-01-05 7 views
12

Mise à jouraméliorer les performances du modèle jQuery

Apparemment, les modèles jQuery peut être compilé et il aide à la performance pour les modèles avec si les déclarations montré here.

Mais comme indiqué here, les modèles jQuery précompilés ne font pas beaucoup pour mon cas puisque mon modèle ne contient pas de bloc logique. Pour ceux qui suggèrent l'utilisation d'un autre moteur de gabarit, idéalement, je voudrais utiliser uniquement des gabarits jQuery car tout le monde dans l'équipe ne connaît que jQuery. Il y a aussi un cas de test this qui compare un moteur de template.


Salut,

Encore aujourd'hui, on m'a dit qu'il ya des problèmes de performance avec l'aide de modèles jQuery. Pour comparer, j'ai utilisé les modèles jQuery et la bonne vieille méthode d'ajout de chaîne pour ajouter des lignes à une table. Les résultats peuvent être vus here. L'utilisation de modèles jQuery est environ 65% plus lente que la méthode d'ajout de chaîne, Ouch!

Je me demande ce que l'on peut faire pour améliorer les performances du script de template jQuery.

Le script complet peut être visualisé dans le lien fourni. Mais l'idée de base est la suivante:

Modèle:

<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> 

données:

<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> 

Exécute:

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

Merci,

Chi

Répondre

0

Votre modèle est très simple, vous pourriez vouloir take a look at handlebars.js qui est une langue qui a templating l'option de précompiler les modèles.

Elle est faite par des rails et un membre de noyau de jquery Yehuda Katz.

+0

Je ne me dérange pas de vérifier guidon. Mais leur téléchargement ne fonctionne pas. Si je référence juste "handlebars.js" de la source, il échouera avec la méthode non définie "required". Avez-vous une copie du fichier js assis autour? –

+0

Les modèles jquery «compilent» également les modèles ... – user406905

+0

Apparemment, les modèles de «compilation» n'aident que s'il y a des blocs de contrôle logiques. Veuillez vérifier la question mise à jour pour plus de détails. –

4

Cela semble être le plus rapide du moteur en ce moment: http://documentcloud.github.com/underscore/

Vous pouvez trouver une suite de tests d'analyse comparative ici qui compare les différents cadres de matriçage actuellement disponibles: https://github.com/aefxx/jQote2 [télécharger et exécuter jqote.benchmark.htm]. Je crois que les templates jQuery sont à leurs balbutiements et les performances s'amélioreront dans les itérations suivantes.

+0

Je pense que c'est la réponse la plus proche ... en fait, attendez que le modèle jQuery améliore les performances sur la route. Pour l'instant, je vais essayer de ne plus en dépendre. –

+0

et si vous avez besoin d'obtenir une vitesse de tueur, utilisez le trait de soulignement. c'est plus proche du javascript natif. Bien sûr, vous devez modifier/modifier un peu vos templates jQuery (plus si vous utilisez des boucles/logique conditionnelle et d'autres choses complexes). bonne chose est, malgré le manque de documentation élaborée, vous pouvez toujours gérer tout cela et dans certains cas, plus facile que jQuery façon. – Mrchief

1

Cela dépend beaucoup du navigateur qui effectue le rendu.IE6 peut être assez lent (bien que le transfert de 1 000 grandes lignes de balisage HTML et l'injection dans le document ne soit pas rapide non plus).

Voici un jsperf benchmark that generates 1,000 rows of 10 columns and renders it. I'm averaging 200-250ms to render les 1000 lignes de Chrome 9.

La question plus importante devrait vraiment être: Pourquoi dans le monde vous affichiez 1000 lignes à la fois? Il y a toujours de meilleures alternatives à l'UX.

+0

Nous n'essayons pas de faire 1000 lignes, mais plutôt 100 lignes. 100 lignes n'est pas si mauvais :). Je veux tester rapidement la performance de la modélisation, car nous cherchons à construire une grille interactive où chaque affiche un résultat différent en fonction des données. Il y aura beaucoup plus de logique de modèle alors juste en ajoutant des rangées bien sûr. Le test écrit est juste un moyen de voir si la performance pourrait être un problème sur la route. –

+0

J'ai créé un nouveau bâtiment de test RAW HTML et les vitesses que j'obtiens semblent être plus rapides que le modèle jQuery. http://jsperf.com/jquery-templates-performance/4 - Modèle jQuery (1.2sec), HTML brut (0.2 sec)! Différence massive –

+0

Si vous allez copier/coller la réponse de quelqu'un d'autre, au moins leur donner crédit. http://stackoverflow.com/questions/4590718/jquery-templates-performance/4590790#4590790 –

5

Chi Chan,

un peu en retard sur la piste avec celui-ci. J'ai découvert que compiler les modèles d'abord et ensuite les référencer par un Id de chaîne (dans le cas ci-dessous, la variable nommée templateAlias) est en fait 10 fois plus rapide que de passer par la route de l'objet. Voici comment vous atteindre cet objectif (en fonction de votre exemple de code):

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

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

cela devrait accélérer considérablement procedings que le modèle aura été compilé et ne pas utiliser la chaque fois que l'ensemble du modèle d'objet que vous exécutez le .appendTo() fonction. L'utilisation de $('#tmplRow').tmpl(data).appendTo('#table'); signifie que $('#tmplRow') interroge le DOM, tandis que $.tmpl(templateAlias, data).appendTo('#table'); ajoute uniquement au DOM en fonction de la référence au modèle. il y a pas mal de lecture sur le sujet.

est ici un lien qui peut aider:

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

espérons que cette aide, Bonne chance ...

+0

Salut Jim! Merci pour votre contribution :) Votre présentation est géniale. Je suis toujours très dérangé par la chose du modèle compilé.Je ne sais pas ce qu'il fait en arrière-plan, mais il semble qu'un modèle compilé ne ferait que faire la différence s'il y a des blocs conditionnels dans le modèle. J'ai écrit un test pour cela, jetez un oeil au bloc "Mise à jour" dans la question. Bizarre hein? –

+0

Chi - essayez de 'brancher' mon code ci-dessus dans votre test en tant que 2ème mise à jour et voyez quelle est la différence. Je pense que les chiffres vont baisser d'un bon 60-70% ... –

+0

Je pense que votre test de performance est défectueux. Peut-être que cela ne fera pas de différence, mais j'exécuterais la seconde instruction "$ .tmpl" une fois sans mesurer et * puis * l'exécuterai 1000 fois pour voir à quelle vitesse il est. La méthode peut faire une certaine optimisation dans les coulisses la première fois que son exécution. Au moins, je l'espère bien. En résumé, vos deuxièmes 1000 exécutions incluent toutes les optimisations possibles effectuées lors de l'analyse n ° 1. –

Questions connexes