2011-01-05 15 views
12

AktualizacjaPoprawa wydajności jQuery szablonu

Najwyraźniej jQuery Szablony mogą być kompilowane i pomaga wydajność szablonów z if pokazano here.

Ale jak pokazano here, prekompilowane szablony jQuery nie zrobiły wiele dla mojego przypadku, ponieważ mój szablon nie zawiera bloku logicznego.

Dla tych, którzy sugerują użycie innego mechanizmu szablonowego, idealnie chciałbym użyć tylko szablonów jQuery, ponieważ wszyscy w zespole znają tylko jQuery. Istnieje również przypadek testowy this, który porównuje kilka silników szablonów.


Cześć,

Właśnie dzisiaj powiedziano mi, że istnieją problemy z wydajnością z użyciem szablonów jQuery.

Aby porównać, użyłem szablonów jQuery i starej dobrej metody dodawania ciągów do dodawania wierszy do tabeli. Wyniki można zobaczyć here. Korzystanie z szablonów jQuery jest o około 65% wolniejsze w porównaniu do metody dodawania ciągów, Ouch!

Zastanawiam się, co można zrobić, aby poprawić wydajność skryptu szablonu jQuery.

Pełny skrypt można wyświetlić w dostępnym linku. Ale podstawowa idea jest następująca:

Szablon:

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

danych:

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

Wykonuje:

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

Dzięki,

Chi

Odpowiedz

0

Szablon jest bardzo proste, może chcesz take a look at handlebars.js który to język szablonów, który ma możliwość precompile szablonów.

Jest wykonana przez szyny i rdzeń jquery członka Yehuda Katz.

+0

mi to nie przeszkadza, aby sprawdzić kierownicę. Ale ich pobieranie nie działa. jeśli odwołam się tylko do "handlebars.js" ze źródła, to zawiedzie z niezdefiniowaną metodą "required". Czy masz już kopię pliku js? –

+0

Szablony jquery "kompilują" szablony również ... – user406905

+0

Wygląda na to, że szablony "kompilujące" pomagają tylko wtedy, gdy istnieją bloki sterujące logiki. Sprawdź zaktualizowane pytanie, aby uzyskać szczegółowe informacje. –

4

To wydaje się być najmocniejszy silnik teraz: http://documentcloud.github.com/underscore/

można znaleźć tutaj zestaw testów porównawczych, który porównuje wszystkie różne ramy szablonów dostępnych obecnie: https://github.com/aefxx/jQote2 [pobierz i uruchom jqote.benchmark.htm].

Wierzę, że szablony jQuery są w powijakach, a wydajność poprawi się w kolejnych iteracjach.

+0

Myślę, że jest to najbliższa odpowiedź ... w zasadzie czekać na szablon jQuery, aby poprawić wydajność w dół drogi. Na razie postaram się nie polegać na tym. –

+0

Jeśli potrzebujesz prędkości zabójcy, użyj podkreślenia. jest bliżej natywnego javascriptu. oczywiście, musisz zmienić/zmodyfikować szablony jQuery (więcej, jeśli używasz pętli/logiki warunkowej i innych skomplikowanych rzeczy). Dobrą rzeczą jest to, że pomimo braku rozbudowanej dokumentacji nadal można sobie z tym poradzić, a w niektórych przypadkach łatwiej niż w jQuery. – Mrchief

1

To zależy od przeglądarki, która wykonuje renderowanie.IE6 może być dość powolny (chociaż przeniesienie 1000 dużych wierszy znaczników HTML i wstrzyknięcie go do dokumentu również nie będzie szybkie).

Tutaj jest jsperf benchmark that generates 1,000 rows of 10 columns and renders it. I'm averaging 200-250ms to render z 1000 wierszy w Chrome 9.

Ważniejsze pytanie powinno być naprawdę: Dlaczego w świecie ty wyświetlając 1000 wierszy na raz? Zawsze są lepsze alternatywy UX.

+0

Nie próbujemy wykonać 1000 wierszy, ale raczej 100 wierszy. 100 wierszy nie jest tak źle :). Chcę szybko przetestować wydajność szablonów, ponieważ chcemy zbudować interaktywną siatkę, gdzie każdy z nich będzie wyświetlał inny wynik w zależności od danych. Będzie dużo więcej szablonów logicznych, a potem tylko dodawanie wierszy. Napisany test jest tylko sposobem sprawdzenia, czy wydajność może być problemem na drodze. –

+0

Stworzyłem nowy budynek testowy RAW HTML i prędkości, które otrzymuję, wydają się szybsze niż szablon jQuery. http://jsperf.com/jquery-templates-performance/4 - szablon jQuery (1,2sec), nieprzetworzony HTML (0,2 s)! Ogromna różnica –

+0

Jeśli masz zamiar skopiować/wkleić cudzą odpowiedź, daj im przynajmniej kredyt. http://stackoverflow.com/questions/4590718/jquery-templates-performance/4590790#4590790 –

5

Chi Chan,

trochę późno na szlaku z tego. Odkryłem, że kompilowanie szablonów najpierw, a następnie odwoływanie się do nich za pomocą ciągu znaków Id (w przypadku poniżej, nazwana zmienna templateAlias) jest w rzeczywistości 10 razy szybsze niż przejście przez trasę obiektu. Oto w jaki chcesz osiągnąć (w oparciu o próbki kodu):

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

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

powinno to znacznie przyspieszyć procedings jako szablon zostaną skompilowane i nie będzie używany przez cały model obiektu za każdym uruchomieniu .appendTo() funkcjonować. Używanie $('#tmplRow').tmpl(data).appendTo('#table'); oznacza, że ​​zapytanie dotyczy DOM, natomiast $.tmpl(templateAlias, data).appendTo('#table'); dodaje tylko do DOM na podstawie odwołania do szablonu. jest sporo czytania na ten temat.

Oto link, które mogą pomóc:

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

nadzieję, że to pomaga, powodzenia ...

+0

Witaj Jim! Dziękuję za Twój wkład :) Twoja prezentacja jest niesamowita. Nadal jestem bardzo zaniepokojony kompilacją szablonu.Nie wiem, co robi w tle, ale wygląda na to, że skompilowany szablon byłby jedyny, gdyby w szablonie były bloki warunkowe. Napisałem do tego test, spójrz na blok "Aktualizacja" w pytaniu. Dziwne, huh? –

+0

Chi - spróbuj "podłączyć" mój kod powyżej do testu jako druga aktualizacja i zobacz, jaka jest różnica. Liczę, że liczby spadną o dobre 60-70% ... –

+0

Myślę, że twój test wydajności jest wadliwy. Może to nie będzie miało znaczenia, ale uruchomiłbym drugą instrukcję "$ .tmpl" raz bez pomiaru i * następnie * uruchomiłem ją 1000 razy, aby zobaczyć, jak szybko to działa. Ta metoda może przeprowadzać pewne optymalizacje za kulisami przy pierwszym uruchomieniu. Przynajmniej mam taką nadzieję. W skrócie, twoje drugie 1000 uruchomień obejmuje wszelkie możliwe optymalizacje, które są wykonywane w przebiegu nr 1. –

Powiązane problemy