16

:firstセレクターで使うのかセレクターで使うのかわかりません:eq(0)。彼らは常に同じオブジェクトを返すと確信していますが、一方が他方よりも高速ですか?

ここの誰かが以前にこれらのセレクターのベンチマークを行ったことがあるはずですが、どちらかが速いかどうかをテストするための最良の方法はよくわかりません。

更新:これが私が実行したベンチです:

/* start bench */
for (var count = 0; count < 5; count++) {
    var i = 0, limit = 10000;
    var start, end;
    start = new Date();
    for (i = 0; i < limit; i++) {
        var $radeditor = $thisFrame.parents("div.RadEditor.Telerik:eq(0)");
    }
    end = new Date();
    alert("div.RadEditor.Telerik:eq(0) : " + (end-start));
    var start = new Date();
    for (i = 0; i < limit; i++) {
        var $radeditor = $thisFrame.parents("div.RadEditor.Telerik:first");
    }
    end = new Date();
    alert("div.RadEditor.Telerik:first : " + (end-start));
    start = new Date();
    for (i = 0; i < limit; i++) {
        var radeditor = $thisFrame.parents("div.RadEditor.Telerik")[0];
    }
    end = new Date();
    alert("(div.RadEditor.Telerik)[0] : " + (end-start));
    start = new Date();
    for (i = 0; i < limit; i++) {
        var $radeditor = $($thisFrame.parents("div.RadEditor.Telerik")[0]);
    }
    end = new Date();
    alert("$((div.RadEditor.Telerik)[0]) : " + (end-start));
}
/* end bench */

3番目が最も速く、4番目が最も遅いと思いましたが、私が思いついた結果は次のとおりです。

FF3:    :eq(0)  :first  [0] $([0])
trial1  5275    4360    4107    3910
trial2  5175    5231    3916    4134
trial3  5317    5589    4670    4350
trial4  5754    4829    3988    4610
trial5  4771    6019    4669    4803
Average 5258.4  5205.6  4270    4361.4

IE6:    :eq(0)  :first  [0] $([0])
trial1  13796   15733   12202   14014
trial2  14186   13905   12749   11546
trial3  12249   14281   13421   12109
trial4  14984   15015   11718   13421
trial5  16015   13187   11578   10984
Average 14246   14424.2 12333.6 12414.8

最初のネイティブDOMオブジェクトが最速()であるということについては正しかったのですが、そのオブジェクトをjQuery関数でラップする方がと![0]の両方よりも速かったとは信じられません。:first:eq(0)

私が間違っていない限り。

4

3 に答える 3

15

jQueryのソースコードによると、これ.first()は次の便利なラッパーです.eq(0)

first: function() {
    return this.eq( 0 );
},

これは、JQuery/3.6.0の時点でも当てはまります。

于 2013-04-09T08:20:31.847 に答える
7

2018:はい。同じ結果が返されますが、2018年:first:eq(0)パフォーマンスの違いはごくわずかで、おそらく些細なことです。

2010:良い質問と素晴らしい投稿。しばらく前にこれをテストしましたが、正確な結果を思い出せませんでした。まさに私が探していたものなので、これを見つけて本当にうれしいです。

少し遅くなる理由は:first:eq(0)おそらくパフォーマンスの解析に関連していると思います。これらを省略すると、jQueryエンジンでネイティブ関数getElementsByTagNamegetElementsByClassName関数を利用できるようになります。

DOM要素が最速でアクセスできるのは当然のことです。forループでjQueryを使用してDOM要素をラップしても、 jQueryはキャッシュの目的でexpandoプロパティを使用するため、必ずしもパフォーマンスに悪影響を与えるとは限りません。

ただし、get(0)DOM要素アクセスとどのように比較され、そのjQueryラッピングがどのように機能しeq(0)、残りの結果が得られるかを確認するのは興味深いことです。

于 2010-01-21T10:02:21.910 に答える
6

はい、それらは同等です。

いいえ、それらが大幅に異なる可能性はありません(他のものはマイクロ最適化です)。

于 2009-08-05T15:47:00.417 に答える