jquery, с точки зрения производительности, что быстрее getElementById или селектор jquery?

Что лучше по производительности document.getElementById('elementId') или $('#elementId') ? Как рассчитать скорость самостоятельно?


person Ahmed Magdy    schedule 06.12.2009    source источник


Ответы (8)


Если вас беспокоит производительность, встроенный getElementById работает намного быстрее, но jQuery дает вам очень удобный доступ ко многим вещам. Итак, вы можете использовать что-то вроде:

$( document.getElementById("some_id") ).jQueryCall();

Это даст вам лучшую производительность и в то же время позволит вам использовать jQuery.

person jeffreyveon    schedule 06.12.2009
comment
Я не уверен, что когда-нибудь перестану мысленно благодарить вас за то, что вы показали мне это... :) - person VoidKing; 14.05.2013
comment
Я знаю, что это старо, но не могли бы вы уточнить? Я нигде не могу найти этот метод jQueryCall(). Спасибо - person victor; 24.11.2014
comment
@victor - jQueryCall() был просто заполнителем для любой обычной функции jQuery. Например, чтобы получить ширину элемента с идентификатором foo, вы должны сделать: $( document.getElementById('foo') ).width() - person jeffreyveon; 25.11.2014
comment
Потрясающий! Не знал, что ты так умеешь. - person BarryMode; 25.01.2016
comment
Это кажется немного быстрее, чем прямая версия jQuery, но пользовательский метод не запрашивался в вопросе. Кроме того, согласно тесту производительности, который я создал и запустил, он оказался на 89% медленнее, чем стандартный эквивалент JavaScript. Не стесняйтесь запустить его для себя? stackoverflow.com/a/46286422/4386681 - person Uniphonic; 18.09.2017

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

person Marius    schedule 06.12.2009
comment
+1. Кроме того, разница в скорости зависит от того, как вы его используете. Если это всего лишь один вызов любого из них, вряд ли будет какая-либо разница. Если вызов выполняется сотни или тысячи раз внутри цикла или рекурсивно или что-то в этом роде, вы можете заметить, что селектор jQuery работает немного медленнее. - person ; 06.12.2009

Используйте http://jsperf.com/, если вы хотите проверить какую-либо производительность между jquery и dom, но jquery обычно медленнее со всем, так как он основан на dom.

person Marcio    schedule 25.01.2012
comment
Ваша ссылка не работает, по этому URL-адресу есть эквивалент: jsperf.com/getelementbyid-vs -jquery-id/44 - person TyrionGraphiste; 27.03.2015
comment
@TyrionGraphiste Извините, на сегодняшний день ваша ссылка также не проходит тесты. Он говорит, что $ не определено. - person Haradzieniec; 18.01.2017

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

var now = Date.now();
var diff = 0;
console.log(now);

for(var i=0; i < 1000000; i++)
{
   if($(document.getElementById("test")).css('opacity') == '0.2')
       $(document.getElementById("test")).css('opacity', '1');
   else
      $(document.getElementById("test")).css('opacity', '0.2');
}

diff = Date.now() - now;
console.log('With $(document.getElementById("test")).somejQueryCall(): ' + diff + ' milliseconds');

////////////////////////////////////////////////////////////////////////

var now2 = Date.now();
var diff2 = 0;
console.log(now2);

for(i=0; i < 1000000; i++)
{
   if($("#test").css('opacity') == '0.2')
       $("#test").css('opacity', '1');
   else
      $("#test").css('opacity', '0.2');
}

diff2 = Date.now() - now2;

console.log('With $("#test").somejQueryCall(): ' + diff2 + ' milliseconds');

////////////////////////////////////////////////////////////////////////

var now3 = Date.now();
var diff3 = 0;
var elem = $("#test");
console.log(now3);

for(i=0; i < 1000000; i++)
{
   if(elem.css('opacity') == '0.2')
       $(elem).css('opacity', '1');
   else
      $(elem).css('opacity', '0.2');
}

diff3 = Date.now() - now3;

console.log('With $(elem).somejQueryCall(): ' + diff3 + ' milliseconds');

После запуска этого скрипта я получил следующие результаты:

Выполнить 1

С $(document.getElementById("test")).somejQueryCall(): 552 миллисекунды

С $("#test").somejQueryCall(): 881 миллисекунда

С $(elem).somejQueryCall(): 1317 миллисекунд

Запуск 2

С $(document.getElementById("test")).somejQueryCall(): 520 миллисекунд

С $("#test").somejQueryCall(): 855 миллисекунд

С $(elem).somejQueryCall(): 1289 миллисекунд

Запуск 3

С $(document.getElementById("test")).somejQueryCall(): 565 миллисекунд

С $("#test").somejQueryCall(): 936 миллисекунд

С $(elem).somejQueryCall(): 1445 миллисекунд

Я не могу поверить в разницу!!! Просто нужно было поделиться этим!

Мир!

person An0nC0d3r    schedule 30.09.2015

Конечно, getElementById работает быстрее, но с помощью jQuery вы можете делать многое.

Чтобы проверить это, вы можете попробовать выполнить цикл 10 000 раз для каждого и сравнить временные метки до и после.

person YOU    schedule 06.12.2009

Собственный метод getElementById работает быстрее. Движок селектора Jquery просто оборачивает это для любых селекторов #x.

Используя консоль firebug, вы можете профилировать jquery следующим образом. Не уверен, что это хорошо работает для собственных вызовов API, таких как getElementById.

console.profile();
$('#eleId');
console.profileEnd();
person redsquare    schedule 06.12.2009

Хе. Исследуя этот вопрос, я нашел этот отличный пост. А также пост об этом с последними новостями на учебном сайте JQuery с конкретными советами по оптимизации скорости!

Стоит отметить, что с последней спецификацией DOM, скорее всего, вам не нужно беспокоиться о производительности в целом. Только когда вы создали (или обнаружили) узкое место.

Оптимизировать селекторы

person Richard Cooke    schedule 21.04.2017

Поскольку другой тест производительности, ссылка на который была указана на этой странице, оказался неработоспособным, и он также включал то, о чем не спрашивали в этом вопросе (а именно, пользовательский метод jQuery), я решил создать новый тест производительности, чтобы ответить на вопрос. вопрос, который включает точный эквивалент (возвращает элемент DOM) в jQuery вместо пользовательского метода:

https://jsperf.com/jquery-get-0-vs-get-element-by-id

Когда я запускаю его в своем Chrome, он показывает, что прямой jQuery

$('#foo').get(0) 

на 92% медленнее, чем аналогичная операция в стандартном JavaScript

document.getElementById('foo')

Я также попробовал то, что в настоящее время помечено здесь как принятый ответ, который предположительно «намного быстрее», но все же на 89% медленнее, чем стандартный эквивалент JavaScript:

$( document.getElementById("foo") ).get(0);

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

person Uniphonic    schedule 18.09.2017