2011-01-05 13 views
12

更新は、jQueryのテンプレートのパフォーマンスを向上させる

はどうやら、jQueryのテンプレートをコンパイルすることができ、それはhereを示す if文とテンプレートのパフォーマンスが向上します。

しかし、図に示すように、プリコンパイルされたjQueryテンプレートは、テンプレートにロジックブロックが含まれていないため、私のケースではあまり効果がありません。

別のテンプレートエンジンの使用を提案している人にとって、理想的にはjQueryテンプレートだけを使用したいと思うので、チームの誰もがjQueryを知っています。いくつかのテンプレートエンジンを比較するテストケースもthisです。


こんにちは、

ただ、今日は私がjQueryのテンプレートを使用してパフォーマンスの問題があると言われました。

比較するには、jQueryテンプレートと古い古い文字列の追加メソッドを使用して、テーブルに行を追加しました。結果はhereとなります。 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> 

おかげで、

チー

答えて

0

はあなたのテンプレートは本当に簡単です、あなたは、テンプレートをプリコンパイルするためのオプションを持っているテンプレート言語であるtake a look at handlebars.jsする場合があります。

これはレールとjqueryコアメンバーのYehuda Katzによって作られています。 http://documentcloud.github.com/underscore/

あなたは、現在入手可能なすべての異なるテンプレートフレームワークを比較し、ここでベンチマークテストスイートを見つけることができます:https://github.com/aefxx/jQote2 [ダウンロードとjqote.benchmark.htm実行]

+0

私はハンドルバーをチェックアウトしても構いません。しかし、彼らのダウンロードは機能しません。ソースから "handlebars.js"だけを参照すると、未定義のメソッド "required"で失敗します。 jsファイルのコピーがありますか? –

+0

jquery templatesはテンプレートも 'コンパイル'します... – user406905

+0

ロジック制御ブロックがある場合は、明らかに 'コンパイル'テンプレートが役立ちます。詳細については、更新された質問を確認してください。 –

4

はこれが最速今エンジンのようです。

jQueryテンプレートは初期段階にあり、後続の繰り返しでパフォーマンスが向上すると思います。

+0

私はこれが最も近い答えだと思っています...基本的には、jQueryテンプレートがパフォーマンスを改善するのを待ちます。今のところ、私はそれに依存しないようにします。 –

+0

と、キラー速度を得る必要がある場合は、アンダースコアを使用してください。それはネイティブのjavascriptに近いです。もちろん、あなたはjQueryテンプレートを少し変更/調整する必要があります(ループ/条件付きロジックやその他の複雑なものを使用する場合はさらに)。良いことは、精巧な文書がないにもかかわらず、jQueryのやり方よりも、すべての場合や場合によっては簡単に管理できることです。 – Mrchief

1

レンダリングを行うブラウザによっては、多くの部分が異なります。IE6はかなり遅くなることがあります(HTMLマークアップの1,000行の大きな行を転送し、ドキュメントに挿入することは高速ではありません)。

はここ9

より多くの重要な質問が本当にあるべきChromeのjsperf benchmark that generates 1,000 rows of 10 columns and renders it. I'm averaging 200-250ms to render 1,000行です:なぜ世界では一度に1,000行を表示していますか?常にUXの方が優れています。

+0

私たちは1000行ではなく、100行を実行しようとしています。 100行はそれほど悪くはありません:)。私はテンプレートのパフォーマンスを素早く試してみたいと思っています。なぜなら、各​​がデータに応じて異なる結果を表示するインタラクティブなグリッドを構築しようとしているからです。より多くのテンプレートロジックがあり、もちろん行を追加するだけです。書かれたテストは、パフォーマンスが問題になるかどうかを確認する方法です。 –

+0

私は新しいテストビルドのRAW HTMLを作成しました。そのスピードはjQueryテンプレートより速いようです。 http://jsperf.com/jquery-templates-performance/4 - jQueryテンプレート(1.2秒)、生のHTML(0.2秒)!大きな違い –

+0

他人の回答をコピー/ペーストする場合は、少なくともクレジットを与えてください。 http://stackoverflow.com/questions/4590718/jquery-templates-performance/4590790#4590790 –

5

Chi Chan、

これでトレイルに少し遅れています。テンプレートを最初にコンパイルし、文字列Id(以下のケースでは、名前付き変数templateAlias)で参照すると、実際にはオブジェクトルートを経由するより10倍高速です。ここでは、(あなたのコードサンプルに基づいて)それを達成したい方法は次のとおりです。これは、テンプレートがコンパイルされていますよう大幅procedingsをスピードアップする必要があり、あなたが.appendTo()を実行して、オブジェクト全体モデル毎回使用されることはありません

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

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

関数。 $('#tmplRow').tmpl(data).appendTo('#table');を使用すると、$('#tmplRow')はDOMに照会しますが、$.tmpl(templateAlias, data).appendTo('#table');はテンプレートへの参照に基づいてDOMに追加するだけです。主題についてかなりの読書があります。このことができます

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

希望、幸運...

+0

こんにちはジム!あなたの入力をありがとう:)あなたのプレゼンテーションは素晴らしいです。私はまだコンパイルされたテンプレートのことに悩まされています。私はそれがバックグラウンドで何をしているのかわかりませんが、コンパイルされたテンプレートは、テンプレートに条件ブロックがある場合にのみ違いがあるようです。私はそのためのテストを書いて、質問の "更新"ブロックを見てください。奇妙なのね? –

+0

上記のコードを2回目の更新としてテストに挿入し、その違いを確認してください。私は数字が良い60-70%で来ると思う... –

+0

私はあなたのパフォーマンステストに欠陥があると思います。おそらくそれは違いはありませんが、私は2回目の "$ .tmpl"ステートメントを測定せずに1回実行し、それを1000回実行してどれほど速いかを確認します。このメソッドは、最初の実行時にシーンの後ろで最適化を行っている可能性があります。少なくとも私はそう思います。 要するに、1000回目の実行には、実行1で実行されている可能性のある最適化がすべて含まれています。 –

0

誰もが口ひげを言及していない:

はここで助けるかもしれないリンクです。 2011年の後半には、人気のあるテンプレートフレームワークから最高のパフォーマンスが得られました。

http://mustache.github.com/

関連する問題