LINUX.ORG.RU

Что быстрее?

 , , ,


1

2

Всем доброго времени суток!

Так уж получилось, что в последнее время много приходится писать на стороне клиента (javascript). До сегодняшнего дня активно использовал библиотку jquey и горя не знал. Тут тебе и удобные селекты, и $.ajax(), и $.each(), и куча визуальных эффектов и много всего другого.

Не так давно я стал замечать некоторые тормоза своего приложения. Мало того, что приходится часто обращаться к серверу и вытягивать огромные коллекции данных, так еще интерфейс еле ворочается! Но если с оптимизацией серверной логики все более-меннее понятно, то как можно оптимизировать клиентскую часть мне пока еще не очень ясно.

Немного погуглив, узнал, что многие веб-девелоперы, если того не требуют обстоятельства, стараются использовать нативный javascript-код, вместо каких-либо библиотек, подобных jquery. Посему, у меня вопрос, так сказать, к знатокам «клиентского веба», сильно ли можно выйграть в производительности, использую средства «чистого» js, без использования сторонних оберток наподобие JQuery?

На сколько сильным будет прирост в производительности «рутинных» операций, например: селектов, отправки ajax-запросов, парсинга json, обход свойств объектов, поиск в массиве и т.д. ?

Основной поинт жквери в том, что оно обеспечивает переносимость между разными браузерами. С нативным js-кодом надо быть готовым всё это взять на себя.

На сколько сильным будет прирост в производительности «рутинных» операций, например

Чтобы устранить проблему, надо её сначала понять. Поэтому профайлер в руки и вперед!

yoghurt ★★★★★
()

хорошие приросты можно получить на операциях с DOM. остальное - в пределах погрешности.
а вообще - google://jquery+vs+vanilla+benchmark и все увидишь сам.

dib2 ★★★★★
()

Самые большие тормоза с жквэрей случаются когда ты начинаешь бездумно юзать селекторы. Почитай как они работают и станет понятно, что и где может тормозить. В общем случае старайся юзать id там где это возможно. Избегай селекторов типа '.classname a' - оно найдет сначала все <a> а потом будет проверять какой из них вложен в .classname. А если до .classname у тебя десяток родителей то вообще здец. В таких случаях доставай сначала classname, а потом ищи в нем <a> ну и так далее короче... Погугли статьи по оптимизации - тыщи их.

Suntechnic ★★★★★
()
Последнее исправление: Suntechnic (всего исправлений: 1)

удобные селекты

Не, полезного то, конечно, хватает, но document.querySelector() и document.querySelectorAll() пора бы для себя открыть.

anonymous
()
Ответ на: комментарий от anonymous

Это смотря надо ли ему поддерживать старьё или не надо. Но да, лорчую.

deep-purple ★★★★★
()
Ответ на: комментарий от anonymous

Они не во всех браузерах работают - жкверя обеспечивает работу и без их поддержки. Хотя браузеры где они не работают уже и не нужны наверно, но есть одно НО - они не спасают если ты пишешь что-то вроде:

$('.mt40 .field2 a.btn-black.underline').on('click',function(){

Если трудно догадаться, то mt40 - это стиль для задания элементу margin-top в 40px, .field2 - input'ы с выравниваинем по правому краю, btn-black - кнопка черного цвета, а underline внезапно текст без подчеркивания. И вот это селектор кнопки Оформить в корзине. Пример из реального проекта.

Вот это говно абсолютно не поддерживаемо и будет тупить хоть жкверей хоть без нее.

Suntechnic ★★★★★
()
Последнее исправление: Suntechnic (всего исправлений: 1)

я отсылаю код обратно разработчикам кода на основе либы jquery, где задача позволяет писать нативно
бил бы таких по рукам, пропади они пропадом эти jкверисты!

reprimand ★★★★★
()

Тормозит, потому что скорее всего быдлокод. Смотри на предмет утечек, некорректных обработчиков, селекторов, уборки мусора, ущербной архитектуры.

anonymous
()

Использую jQuery, кучу плагинов, Require.js, Angular, Knockout и много чего еще — у меня не тормозит :)

Анимации лучше делать средствами CSS, и лучше использовать аппаратно-ускоренные свойства. Нативный JS ты задолбаешься делать кросбраузерным и в итоге напишешь свою тормозную jQuery. Селекты и правда медленные, поэтому сохраняй DOM объекты в переменные, вместо того чтобы каждый раз их дергать.

.my-widget {
  opacity: 1;
  transition: all 1s;
}
.my-widget.hide { opacity: 0 }
var $widget = $('.my-widget');
$widget.on('click', function() {
  $widget.addClass('hide');
}

Black_Roland ★★★★
()

Немного погуглив, узнал, что многие веб-девелоперы, если того не требуют обстоятельства, стараются использовать нативный javascript-код, вместо каких-либо библиотек, подобных jquery.

Это все на гране суеверий. Больше всего тормозят операции с DOM. Там где ты получаешь кучу данных с сервера после получения выводи их не по 1 строчке в таблицу а собирай все в переменную и добавляй в DOM за 1 раз.

TDrive ★★★★★
()

Ну и поиск DOM элементов вынеси из циклов, создавай в начале скрипта переменные с нужными DOM элементами и юзай их.

TDrive ★★★★★
()
Последнее исправление: TDrive (всего исправлений: 1)
Ответ на: комментарий от anonymous

Не, полезного то, конечно, хватает, но document.querySelector() и document.querySelectorAll() пора бы для себя открыть.

Кстати, раз уж в этом треде пошла речь про селекты jQuery, то у меня вопрос: jQuery использует querySelectorAll или нет? А если я напишу так?

var $one = $('.one');
var $two = $one.find('a:first');
А если без :first? querySelectorAll вообще быстрее работает чем селекторы jQuery или нет?

Black_Roland ★★★★
()
Ответ на: комментарий от Suntechnic

Те браузеры уже мёртвые.

Что касается второго пункта, ты наркоман что ли? querySelectorAll() умеет такие селекторы. Любые селекторы, которые понимает браузер.

var buttons = document.querySelectorAll('.mt40 .field2 a.btn-black.underline');
for(var i = buttons.length - 1; i >= 0; --i) buttons[i].addEventListener('click', function(){}, false);
anonymous
()
Ответ на: комментарий от Black_Roland

IE 8

Товарищ некрофил, виндус икспэ уже мёртвое и нафиг никому не упёрлось, даже гуглу и майкрософт.

anonymous
()
Ответ на: комментарий от TDrive

на гране суеверий

Что за гран то?

Тормозить, к слову, может создание большого количества jquery объектов.

anonymous
()

В общем, ТС, выкладывай код :) Так мы не поймем что у тебя тормозит.

Black_Roland ★★★★
()
Ответ на: комментарий от anonymous

Что за гран то?
Тормозить, к слову, может создание большого количества jquery объектов.

Может но в 99% случаев тормозят селекторы в циклах и добавение кучи данных в таблицу по одному tr

TDrive ★★★★★
()
Ответ на: комментарий от anonymous

Некрофилы, попрошу больше двух не собираться, а запустить виндовс апдейтер.

Кому? Пользователям сайта? Мне к ним домой сходить?

Black_Roland ★★★★
()
Ответ на: комментарий от Black_Roland

Это отдельная ветка, 1.x еще поддерживается.

Я так понимаю это новая версия, а 1.x тихо доживает свой срок. Да и не только jQuery, очень многие js библиотеки отказываются от поддержки ie 8

TDrive ★★★★★
()
Ответ на: комментарий от Black_Roland

Перевожу для наркоманов: единственная версия винды, которая не может бесплатно поставить себе IE9 — икспэ. Пираты должны страдать.

anonymous
()
Ответ на: комментарий от TDrive

Да и не только jQuery, очень многие js библиотеки отказываются от поддержки ie 8

O_o а можно примеры? Еще от IE 7 не все отказались, а IE 8 в основном поддерживается.

Black_Roland ★★★★
()
Ответ на: комментарий от anonymous

Перевожу для наркоманов: единственная версия винды, которая не может бесплатно поставить себе IE9 — икспэ. Пираты должны страдать.

Исчезни, толстячок. Страдают не пираты, а разработчики. У тебя данные реальной статистики браузеров есть? Видимо нет, иначе бы ты не писал чушь.

Black_Roland ★★★★
()
Последнее исправление: Black_Roland (всего исправлений: 1)
Ответ на: комментарий от Black_Roland

Давай уже свою статистику, где к тебе ходят с IE8.

Ты, кстати, пропустил пост, где говорилось, что на IE8 положили большой и толстый болт?

anonymous
()
Ответ на: комментарий от Black_Roland

Разработчики не страдают, они не пишут под это говно. Не считая махровых необновляющихся энтерпрайзеров, да и то те, небось, под IE6 пишут.

Твоя то статистика будет?

anonymous
()
Ответ на: комментарий от Black_Roland

O_o а можно примеры? Еще от IE 7 не все отказались, а IE 8 в основном поддерживается.

Ну вот в бутстрапе ие8 поддерживается с ограничениями и костылями http://toster.ru/q/67732 в фондейшене таже ситуация http://foundation.zurb.com/forum/posts/241 И это крупные проекты.

TDrive ★★★★★
()
Ответ на: комментарий от anonymous

Конечно умеет. Но работать они будут медленно так же как и в жквери.

Suntechnic ★★★★★
()
Ответ на: комментарий от Black_Roland

Сделай мне аналог

// если без очереди ивентов то так
window.onload = function() { ... };

А парсинг JSON?

function parseJSONstring(str) {
    var json = null;
    try {
        json = eval('(' + str + ')');
    } catch (err) {}
    return json;
}
deep-purple ★★★★★
()
Ответ на: комментарий от Black_Roland

Жквери использует движок селекторов http://sizzlejs.com/

Явно авторы не дебилы и если браузер позволяет юзать нативные, то и в либе юзаются нативные. Оверхед тут будет только за счет всяких «лишних» фич, которые в твоем проекте совершенно не надобны.

deep-purple ★★★★★
()
Ответ на: комментарий от TDrive

Ну вот в бутстрапе ие8 поддерживается с ограничениями и костылями http://toster.ru/q/67732

Ну это мелочи, можно сказать поддерживается. Главное работает, а не шашечки :) Тем более мы про JS же.

в фондейшене таже ситуация http://foundation.zurb.com/forum/posts/241

К сожалению не знаю про них ничего, но поверю что крупные.

Black_Roland ★★★★
()
Ответ на: комментарий от anonymous

Тормозить, к слову, может создание большого количества jquery объектов.

Плюсую

deep-purple ★★★★★
()
Ответ на: комментарий от TDrive

Я так понимаю это новая версия, а 1.x тихо доживает свой срок.

Нет, версию 2 сделали спецом для тех кому по ТЗ не надо пилить поддержку кала мамонтов. Ну и себя избавили от кучи костылей, что положительно сказалось на производительности.

deep-purple ★★★★★
()

Начали про оптимизацию, но всё кончилось ie 6,7,8. Вот где тормоза. Если бы не эти поделия, то давно бы летало всё. Хочешь скорости - забей на ишака. Используй современные технологии мозиллы, хрома и всё будет ок, поддерживай ишака в урезанном варианте: статика, простой интерактив.

Какая версия jquery? Кажется там после 1.8 надо использовать для скорости. Не забудь внимательно перечитать гайд по миграции со старых версий на новые.

anonymous
()
Ответ на: комментарий от deep-purple

Жквери использует движок селекторов http://sizzlejs.com/
Явно авторы не дебилы и если браузер позволяет юзать нативные, то и в либе юзаются нативные. Оверхед тут будет только за счет всяких «лишних» фич, которые в твоем проекте совершенно не надобны.

Это все понятно. Просто в jQuery есть еще всякие .find и :first и не понятно как jQuery с ними поступает, может в таких случаях не используются нативные фичи браузера.

Black_Roland ★★★★
()
Ответ на: комментарий от Black_Roland

всякие .find и :first и не понятно как jQuery с ними поступает

Можно открыть исходники и глянуть, я не смотрел, скорее всего наколдовали чего-нибудь боле-мене нормальное.

deep-purple ★★★★★
()

сильно ли можно выйграть в производительности, использую средства «чистого» js, без использования сторонних оберток наподобие JQuery?

да, в разы.

upd: уточнение — использовать jquery вполне допустимо, но нужно понимать где он тормозит, и использовать менее тормозные вещи, где необходимо. например, для конструирования dom — тот же crel всего в ~3 раза тормознее, чем готовая строка с html, тогда как jquery тормознее раз в 10.

вот тут, например, есть прикольное сравнение производительности http://jsperf.com/dom-creation-libs/10

waker ★★★★★
()
Последнее исправление: waker (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.