2013-02-20 2 views
0

Я создал простой пример на jsperf, чтобы помочь объяснить мой вопрос. В примере на jsperf свойство стиля устанавливается по ссылке (я знаю, что это можно сделать без цикла).Что такое наиболее эффективный способ перебора объектов jQuery

Что было бы самым эффективным способом для итерации по объектам jQuery?

Согласно результатам jsperf, .each работает достаточно хорошо, но это также не самый быстрый. Возможно, есть еще лучшее решение, которого мне не хватает.

1.Example с .each:

$('body').find('div.iojo-test-container a').each(function() { 
    $(this).css('color', 'red'); 
}); 

2.Example с для цикла (немного быстрее, чем .each):

var $a = $('body').find('div.iojo-test-container a'); 
for (var i = $a.length; --i;) { 
    $($a[i]).css('color', 'red'); 
} 

3.Fastest способ настройки стиля, но пожалуйста игнорируйте этот случай. Речь идет об итерации и не задании css-стилей.

$('body').find('div.iojo-test-container a').css('color', 'red'); 
+1

Вы оптимизируете из необходимости или просто потому, что? Если '.each()' не дает вам изжоги, и сайт работает очень медленно, не беспокойтесь о [превентивной оптимизации] (http://pivotallabs.com/preemptive-optimization/). –

+1

Конечно, решение 2. быстрее, поскольку «каждый» добавляет дополнительные накладные расходы, но использование jQuery - это не поиск самого быстрого решения, в редких случаях, когда у вас проблемы с производительностью. Сначала вы должны волноваться о читаемости, и «каждый» - лучший выбор. На стороне клиента вам редко приходится беспокоиться, если функция занимает 100 нс вместо 80 нс. –

+0

@dystroy Я согласен, и в приведенном выше случае я бы пошел с jQuery в .each. –

ответ

3

My Humble Opinion

Это одна вещь, чтобы оптимизировать после того как вы развернуты и, возможно, просто хочу для тонкой настройки, но если вы не нуждаетесь в , то вам нужно для оптимизации, не беспокойтесь об этом. .each() отлично работает, а также имеет дополнительное преимущество для чтения. (ясно, что вы повторяете сборку, когда вызывается .each). Не то, чтобы цикл for был менее кратким, но если ваше время загрузки или производительность не захватывают огромные удары, не беспокойтесь об этом на этом этапе игры.

Если скорость действительно была проблемой, jQuery является , возможно, раздутой библиотекой. Выполнение таких звонков, как $(this).attr(), непосредственно доступ к this.attr, может принести пользу, не жертвуя удобочитаемостью (и избегая загружать оболочку jQuery только для установки атрибута). Тем не менее, вы решили использовать библиотеку, поэтому продолжайте использовать ее и сейчас.

+0

Я согласен с вами в важности удобочитаемости и опасности микро-оптимизации. Я использую jQuery, потому что он скрывает проблемы с перекрестным браузером и упрощает жизнь. Когда я смогу избежать библиотеки, я это сделаю. Я с удовольствием использую собственный Javascript для решения проблемы. –

+0

@TJ: не ошибайтесь; Я использую и люблю jQuery, потому что он нормализует код записи (понимая, что я делаю небольшой удар производительности, потому что я представляю как накладные расходы на дополнительную библиотеку, так и большинство операций, которые я выполняю, приносят за счет дополнительной оболочки). Это, как говорится, все еще сокращает время разработки и работает достаточно быстро для большинства потребностей. И все, что может замедлить работу, скорее всего, просто нуждается в рефакторинге (возможно, измените рабочий процесс или операции разделения), не нужно переписывать как «традиционный javascript» [sans jQuery]. –

+0

[последующие действия]. Вы все еще можете использовать jquery и ссылаться на такие вещи, как 'this.value' над' $ (this) .val() '; store 'var $ this = $ (this)' если используется повторно вместо '$ (this) .css (...); $ (Это) .attr (...); $ (Это) .animate() '. Эти (и другие) оптимизации могут сделать jquery эффективным без необходимости жертвовать всей библиотекой и классифицировать ее (в целом) слишком медленно для выполнения. –

-1
$('div.iojo-test-container a').css('color', 'red'); 

JQuery будет перебирать по себе все .iojo-test-container a и установить им свою собственность Css

+1

С вопросом, когда он говорит о подходе 3: «но **, пожалуйста, проигнорируйте этот случай **. Речь идет об итерации, а не о настройке css-стилей». –

+0

в любом случае использовать '$ ('body'). Find ('div.iojo-test-container a')' вместо '$ (selector)' неэффективен. – starowere

+0

Я нашел обратное, чтобы быть правдой при тестировании его с помощью настройки jsPerf в вопросе - использование '.find()' было ** более ** эффективным, чем ваш предложенный селектор. –

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