2009-08-05 7 views
16

Я не уверен, следует ли использовать :first или :eq(0) в селекторе. Я уверен, что они всегда вернут один и тот же объект, но один быстрее, чем другой?Являются ли функции jQuery: 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 */ 

Я предположил, что третий будет самым быстрым и четвёртую будет самым медленным, но вот результаты, которые я придумал:

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, являющийся самым быстрым ([0]), но я не могу поверить, что этот объект в функции jQuery был быстрее, чем и :eq(0)!

Если я не ошибаюсь.

ответ

6

Хороший вопрос, отличный пост. Я тестировал это некоторое время назад и не мог вспомнить точный результат. Я очень рад, что нашел это, потому что это именно то, что я искал.

Я бы предположил, что причина для и :eq(0) является чуть медленнее, скорее всего, связана с производительностью синтаксического анализа. Опуская это, механизм jQuery может использовать собственные функции getElementsByTagName и getElementsByClassName.

Без сюрпризов i.t.o. элемент DOM является самым быстрым для доступа. Обтекание элемента DOM с помощью jQuery в цикле для не обязательно окажет отрицательное влияние на производительность, поскольку jQuery использует свойство expando для целей кэширования.

Однако было бы интересно посмотреть, как сравнивается get(0) с доступом к элементу DOM и как переносимость jQuery тарифов на eq(0) и остальные результаты.

5

Да, они эквивалентны.

Нет, они вряд ли будут существенно отличаться (что-то еще представляет собой микро-оптимизацию).

12

В соответствии с исходным кодом JQuery, в .first() просто удобство обертка для .eq(0):

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

Это должно быть принято отвечать. –

 Смежные вопросы

  • Нет связанных вопросов^_^