Улучшить производительность шаблона jQuery

Обновить

По-видимому, шаблоны jQuery можно скомпилировать, и это повышает производительность шаблонов с операторами if, показанными здесь.

Но, как показано здесь, предварительно скомпилированные шаблоны jQuery не очень подходят для моего случая. так как мой шаблон не содержит логического блока.

Для тех, кто предлагает использовать другой механизм шаблонов, в идеале я хотел бы использовать только шаблоны jQuery, поскольку все в команде знают только jQuery. Существует также этот тестовый пример, в котором сравниваются несколько шаблонизаторов.


Hi,

Только сегодня мне сказали, что есть проблемы с производительностью при использовании шаблонов jQuery.

Для сравнения я использовал шаблоны jQuery и старый добрый метод добавления строк для добавления строк в таблицу. Результаты можно увидеть здесь. Использование шаблонов jQuery примерно на 65% медленнее по сравнению с методом добавления строки, Ой!

Мне интересно, что можно сделать, чтобы улучшить производительность сценария шаблона jQuery.

Полный сценарий можно посмотреть по указанной ссылке. Но основная идея заключается в следующем:

Шаблон:

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

Данные:

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

Выполняет:

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

Спасибо,

Чи


person Chi Chan    schedule 05.01.2011    source источник


Ответы (5)


Чи Чан,

немного опоздал с этим. Я обнаружил, что сначала компилировать шаблоны, а затем ссылаться на них по строковому идентификатору (в приведенном ниже случае именованная переменная templateAlias ) на самом деле в 10 раз быстрее, чем через объектный маршрут. Вот как вы этого добьетесь (на основе вашего примера кода):

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

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

это должно значительно ускорить работу, так как шаблон будет скомпилирован и не будет использовать всю объектную модель каждый раз, когда вы запускаете функцию .appendTo(). Использование $('#tmplRow').tmpl(data).appendTo('#table'); означает, что $('#tmplRow') запрашивает DOM, тогда как $.tmpl(templateAlias, data).appendTo('#table'); только добавляет в DOM на основе ссылки на шаблон. есть довольно много чтения на эту тему.

Вот ссылка, которая может помочь:

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

Надеюсь это поможет. Удачи...

person jim tollan    schedule 28.01.2011
comment
Привет Джим! Спасибо за ваш вклад :) Ваша презентация потрясающая. Меня все еще очень беспокоит скомпилированный шаблон. Я не знаю, что он делает в фоновом режиме, но кажется, что скомпилированный шаблон будет иметь значение только в том случае, если в шаблоне есть условные блоки. Я написал для этого тест, взгляните на блок «Обновление» в вопросе. Странно да? - person Chi Chan; 29.01.2011
comment
Chi - попробуйте «подключить» мой код выше в свой тест в качестве второго обновления и посмотрите, в чем разница. Я думаю, что цифры упадут на 60-70%... - person jim tollan; 29.01.2011
comment
Я думаю, что ваш тест производительности ошибочен. Возможно, это не будет иметь значения, но я бы запустил второй оператор $.tmpl один раз без измерения, а затем затем запустил его 1000 раз, чтобы увидеть, насколько быстро он работает. Метод может выполнять некоторую оптимизацию за кулисами при первом запуске. По крайней мере, я бы очень на это надеялся. Короче говоря, ваши вторые 1000 прогонов включают в себя любую возможную оптимизацию, которая выполняется в прогоне №1. - person Josh Mouch; 17.10.2012

На данный момент это самый быстрый движок: http://documentcloud.github.com/underscore/.

Здесь вы можете найти набор эталонных тестов, в котором сравниваются все доступные в настоящее время фреймворки шаблонов: https://github.com/aefxx/jQote2 [скачайте и запустите jqote.benchmark.htm].

Я верю, что шаблоны jQuery находятся в зачаточном состоянии, и производительность улучшится в последующих итерациях.

person Mrchief    schedule 07.01.2011
comment
Я думаю, что это самый близкий ответ ... в основном, подождите, пока шаблон jQuery улучшит производительность в будущем. Пока я постараюсь не слишком зависеть от него. - person Chi Chan; 15.01.2011
comment
а если вам нужна убийственная скорость, используйте подчеркивание. это ближе к родному javascript. конечно, вам нужно немного изменить/настроить свои шаблоны jQuery (больше, если вы используете циклы/условную логику и другие сложные вещи). Хорошо, что, несмотря на отсутствие подробной документации, вы все равно можете управлять всем этим, а в некоторых случаях даже проще, чем с помощью jQuery. - person Mrchief; 19.01.2011

Это во многом зависит от браузера, который выполняет рендеринг. IE6 может быть довольно медленным (хотя передача 1000 больших строк HTML-разметки и вставка ее в документ тоже не будет быстрой).

Вот тест jsperf, который генерирует 1000 строк из 10 столбцов и отображает их. У меня в среднем 200-250 мс для рендеринга 1000 строк в Chrome 9.

На самом деле более важным вопросом должен быть: с какой стати вы отображаете 1000 строк одновременно? Всегда есть лучшие альтернативы UX.

person Andrea Turri    schedule 09.01.2011
comment
Мы не пытаемся сделать 1000 строк, а скорее 100 строк. 100 строк не так уж и плохо :). Я хочу быстро проверить производительность шаблонов, потому что мы собираемся построить интерактивную сетку, в которой каждый ‹td› отображает разные результаты в зависимости от данных. Конечно, будет намного больше логики шаблонов, чем просто добавление строк. Написанный тест — это просто способ увидеть, может ли производительность стать проблемой в будущем. - person Chi Chan; 11.01.2011
comment
Я создал новый тест, создающий RAW HTML, и скорость, которую я получаю, кажется выше, чем у шаблона jQuery. jsperf.com/jquery-templates-performance/4 — шаблон jQuery (1,2 сек.) , Необработанный HTML (0,2 сек) ! Огромная разница - person Jason Jong; 26.04.2011
comment
Если вы собираетесь копировать/вставлять чужой ответ, по крайней мере, отдайте ему должное. stackoverflow.com/questions/4590718/ - person Bill the Lizard; 04.08.2011

Ваш шаблон действительно прост, вы можете взглянуть на handlebars.js, который является шаблоном язык, который имеет возможность предварительной компиляции шаблонов.

Он сделан основателем rails и jquery Иегудой Кацем.

person Jeduan Cornejo    schedule 06.01.2011
comment
Я не против проверить руль. Но их загрузка не работает. если я ссылаюсь только на handlebars.js из исходного кода, он завершится ошибкой с требуемым неопределенным методом. У вас есть копия файла js? - person Chi Chan; 06.01.2011
comment
По-видимому, «компиляция» шаблонов помогает только при наличии блоков логического управления. Пожалуйста, проверьте обновленный вопрос для деталей. - person Chi Chan; 07.01.2011

Никто не упомянул усы. В конце 2011 года ууса была лучшая производительность среди популярных шаблонизаторов.

http://mustache.github.com/

person naugtur    schedule 15.01.2012