Поширені помилки Javascript, які сильно впливають на продуктивність? [зачинено]


10

Нещодавно UI / UX MeetUp, який я відвідував, я дав кілька відгуків про веб-сайт, який використовував Javascript (jQuery) для своєї взаємодії та інтерфейсу користувача - це були досить прості анімації та маніпуляції, але продуктивність на гідному комп’ютері була приголомшливою.

Насправді це нагадало мені безліч сайтів / програм, які я бачив із тією ж проблемою, де певні дії просто абсолютно руйнують продуктивність. Це здебільшого в (або, принаймні, більш помітній) ситуаціях, коли Javascript майже служить заміною Flash. Це суворо на відміну від деяких веб-сайтів, які я використав, які мають набагато більше Javascript та функціональності, але працюють дуже плавно (COGNOS від IBM - це те, про що я можу придумати верхній частині голови).

Я хотів би дізнатися деякі поширені проблеми, які не враховуються при розробці JS, що призведе до знищення продуктивності сайту.


Ймовірно так само, як і у всіх інших програмах: Робити більше роботи, ніж потрібно, і виконувати ту ж роботу знову і знову, часто сотні разів.

1
@delnan це дуже правда, але, схоже, він набагато більше поширений у JS. Сприйняття, можливо?
Нік

1
Якщо говорити про JavaScript, то, як говорити про сайт, стає трохи проходом. Це скрізь і використовується для всього цього дня.
Адам Кросленд

@Adam Crossland ви абсолютно праві - в тому самому випадку я думаю, що я допоміг розробнику з нативним додатком, який також дуже покладався на jQuery.
Нік

1
Не точно відповідь на ваше запитання, тому я зауважую: я переживав ситуації, коли JavaScript робив багато візуалізації, і насправді движок рендерінгу браузера використовував секунди. Тому, щоб обробити вузьке місце ефективності, я б спершу шукав зайві операції з надання.
користувач281377

Відповіді:


8

Звичайний вбивця продуктивності викликає .lengthHTMLCollection всередині forциклу:

function foo(collection) {
    for (var index = 0; index < collection.length; index++) {
        // do something awesome here
    }
}

Ця антидіаграма спричиняє обчислення розміру колекції при кожному проходженні циклу. Кращим підходом є обчислення довжини поза петлею:

function foo(collection) {
    var collectionLen = collection.length;
    for (var index = 0; index < collectionLen; index++) {
        // do something awesome here
    }
}

3
Залежить від браузера. Візьмемо цей орієнтир як приклад: у FF 5 "нормальний" працює майже в той же час, що і "оптимізована" версія. І навіть у справді старих і млявих браузерах щось подібне, ймовірно, не буде вузьким місцем, якщо JS насправді робить щось цікаве з елементами.

1
Хм! Можливо, сьогодні високооптимізаційні компілятори JIT роблять цю частину мудрості застарілою.
Адам Кросленд

4
Я не справжній експерт тут, але з специфікації ECMA виходить, що довжина - це лише властивість об’єкта масиву. Тож виклик його просто повертає значення замість підрахунку всіх елементів. Не маю уявлення, чи всі реалізації відповідають специфікації, але якщо вони є, ваш код зовсім не покращує продуктивність.
Jacek Prucia

4
@JacekPrucia Він сказав , колекція , а НЕ масив - як правило, в реальному коді, це буде означати список DOM елементів , що повертаються функціями , такими як document.getElementsByTagName. Функція повертає трансляцію, nodeListяка перераховує її довжину щоразу, коли доступ до .lengthвластивості.
Yi Jiang

2
@JacekPrucia тест це підвищення продуктивності. Пошук майна не з дешевих.
Райнос

4

Ні, проблема не пов’язана з JS, який використовується як заміна флеш. Якщо ви не впевнені в цьому, документуйте відповідь про сценарій дій: він дуже близький до JS.

Як вбивця виступу, ви можете знайти кілька поганих практик:

  • Приєднайте обробник подій до постійних подій, наприклад, прокручування, миші миші чи подібних матеріалів. У цього є два недоліки: якщо подія не буде запущена достатньо, ваша програма не буде реагувати. Якщо він спрацьовує занадто багато, у вас буде величезна завантаженість процесора ні за що.
  • Здійснення синхронних дзвінків AJAX. Javascript не є багатопоточним, тоді, коли частина JS чогось чекає, ваша програма заморожена. Вам краще використовувати асинхронні дзвінки AJAX і таким же чином використовувати setTimeout / setInterval, щоб розділити довгу фазу обчислень і підтримувати свою програму реактивною.
  • Висока складність алгоритму, як і в будь-яких інших мовах.

Я бачив більше кількох додатків, які намагаються обертати, полегшувати або анімувати зображення з повним браузером і збиватися під час цього процесу - саме звідси випливає коментар із заміни Flash :)
Nic

Оскільки перший A в AJAX розшифровується як асинхронний, технічно це не AJAX, якщо він синхронний, але ваш пункт все-таки хороший.
Карл Білефельдт

Так, це не зовсім AJAX. Але в будь-якому випадку цього потрібно уникати: D
deadalnix

3

Я дав кілька відгуків про веб-сайт, який використовував Javascript (jQuery) для своєї взаємодії та інтерфейсу користувача - це були досить прості анімації та маніпуляції, але продуктивність на гідному комп’ютері була жахливою.

Найбільшою проблемою в продуктивності є використання абстракцій високого рівня (наприклад, jQuery) без розуміння основної моделі DOM та анімаційної моделі CSS3 (або полотна, або svg).

Якщо ви не знаєте, як це зробити без абстракцій, то у вас абсолютно абсолютні нульові знання про те, які прийоми швидкі чи повільні.

Вивчіть JavaScript, вивчіть DOM. Як тільки ви знаєте цих двох і знаєте, що роблять ваші абстракції під кришкою, ви зможете їх ефективно використовувати. Звичайно, більшу частину часу ви усвідомлюєте, що абстракція - це повільно та просто робити це вручну без бібліотеки.


1

Краса та недолік Javascript в тому, що він надзвичайно гнучкий. За словами, це насправді дозволяє робити те, чого ви, мабуть, не повинні робити у багатьох випадках.

З огляду коду, до якого я брав участь, основні проблеми, як правило, пов'язані з наданням CSS. Для нових розробників JS ми схильні бачити, як занадто багато змінних використовується в глобальному масштабі.

Також неправильне закриття часто може спричинити витік пам'яті. Однак більшість сучасних фреймворків Javascript запобігають подібним проблемам до тих пір, поки ваш код слід за рамками.


0

Ось швидке посилання, яке я знайшов рік або близько тому про написання кращого коду jquery: http://net.tutsplus.com/tutorials/javascript-ajax/10-ways-to-instantly-increase-your-jquery-performance /

Одне, що я щойно знайшов у коді співробітників, що вбивав продуктивність, - це кешування даних, які не потрібно кешувати.

Приклад:

var table = $("#data").dataTable(.....);

DataTables - це плагін jQuery, який ми використовуємо для створення приємних сіток. У будь-якому разі, таблиця мала майже 5 к рядків у ній, застосувавши плагін DataTables, а потім зберегли його в змінній таблиці, фактично змусили FireFox і IE попередити, що сценарій займає занадто багато часу. Мораль історії, кешуйте дані лише у разі потреби.


1
Здається, що DataTables є дійсно неефективним / поганим плагіном, а не проблемою з кешуванням. 5k - це нічого.
Райнос

@Raynos: Він сказав, що 5 к рядків , а не 5 кілобайт даних. "Ряд" може бути дуже великою справою.
Кріс Фармер

@ChrisFarmer Якщо "рядок" - це дуже велика річ, то у вас є інша проблема.
Райнос

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.