SlideShare ist ein Scribd-Unternehmen logo
1 von 60
Профилирование и оптимизация
        jQuery–кода

       Владимир Журавлев
Самый популярный фреймворк*




*
    По данным builtwith.com
Все любят jQuery
•   Простота и более низкий порог вхождения;
•   кроссбраузерный фасад для рутинных операций;
•   наличие плагинов практически на все случаи жизни.
•loop flipping;
•array-push-join вместо сложения строк;
•loop unrolling;
•{'Вася': 1, 'Коля': 1}[name]
•~~ (0.5 + n)
Преждевременная оптимизация
Преждевременная оптимизация
Симптомы:
•оптимизация кода еще до того как он начнет тормозить.

Последствия:
•потеря времени;
•ухудшение читаемости.
Экономия на спичках
Экономия на спичках
Симптомы:
•оптимизация частей кода, принципиально не влияющего на
производительность;
•автоматическое использование «оптимальных» конструкций.

Последствия:
•потеря времени;
•потеря читабельности;
•легко упустить настоящую оптимизацию.
Профилирование
Как измерять?
• Таймеры (например, сonsole.time);
• профилирование JS (Firebug, Web Inspector, YUI Profiler);
• анализ timeline (Web Inspector).
Таймеры
Зачем:
•убедиться, что данный блок кода тормозит;
•постоянно мониторить производительность модулей;
•быстро оценить успешность оптимизации.

Чем замерять:
•сonsole.time;
•любой самописный таймер.
сonsole.time
Использование

   console.time('init');


   /* блок измеряемого кода */


   console.timeEnd('init');
Профилирование JS
Зачем:
•для получения полного отчета о том на что тратит время ваш js код.

Чем профилировать:
•console.profile;
•YUI profiler;
•любой другой самописный профайлер.
console.profile
Достоинства:
•есть в Firefox, Chrome, Safari, IE 8+;
•достаточный минимум.

Недостатки:
•много шума при профилировании jQuery-кода;
•разные форматы отчетов.
console.profile
Использование

   console.profile('init');


   /* блок измеряемого кода */


   console.profileEnd('init');
YUI Profiler
Зачем:
•для браузеров, в которых нет профайлера;
•чтобы профилировать только обращения к jQuery;
•для мониторинга производительности модулей.




developer.yahoo.com/yui/profiler
YUI Profiler
Использование:
   YAHOO.tool.Profiler.registerFunction('init', window);


   // профилируемый код
   init();


   var report = YAHOO.tool.Profiler.getFunctionReport('init');


   YAHOO.tool.Profiler.unregisterFunction('init');
YUI Profiler
Достоинства:
•работает везде;
•хорошо подходит для профилирования jQuery (например, можно
логировать только $.fn.*, $.*).

Недостатки:
•нельзя отличить $(selector) от $(html), $(element), $(function);
•логирует вложенные вызовы, что может искажать статистику;
•нет own time, только total time.
jquery.profile.js
Зачем:
•потому что велосипеды — это здорово;
•чтобы избавиться от недостатков YUI Profiler.

Плюсы:
•не логирует вложенные вызовы;
•раздельно логирует $(selector), $(html), $(function) и $(element).

github.com/private-face/jquery.profile
jquery.profile.js
Использование:
   var profiler = new $.Profiler;


   profiler.start();
   init();
   profiler.stop();


   profiler.topTime();
jquery.profile.js
Недостатки:
•не логирует вложенные вызовы;
•«beta than nothing».
Анализ timeline
Зачем:
•чтобы определить как рендеринг влияет на производительность.

Что использовать:
•Chrome Web Inspector.
Оптимизация
$('div').click(function() {
         var div = $(this);

        // ...
});

$('div').each(function() {
         var div = $(this);

        // ...
});
Селекторы
Симптомы:
•Большое число обращений к $(selector), $.fn.find, и т.п.;
•Некоторые выборки выполняются довольно долго.
1. Селекторы разбираются cправа-налево

   $('div.post a.vote-up')   // плохо

   $('.post .vote-up');      // лучше

   $('.vote-up');            // еще лучше
2. Сужайте область поиска
•Задавайте контекст

   $('div.post a.vote-up');             // плохо
   $('#content').find('.vote-up');      // хорошо


•Используйте children, closest и т.п.

   $('ul#list').find('li');             // плохо
   $('ul#list').children('li');         // хорошо

   $('li').parents('div').first();      // плохо
   $('li').closest('div');              // хорошо
3. Кешируйте выборки и используйте chaining

   $('div.post').mousemove(function() ...);
   $('div.post').find('a').click(function() ...);   // плохо

   var posts = $('div.post');
   posts.mousemove(function() ...);
   posts.find('a').click(function() ...);           // хорошо

   $('div.post')
        .mousemove(function() ...)
        .find('a').click(function() ...)
        .end()
        .find('.invisible').hide();                 // тоже хорошо
4. Делегируйте обработку событий
•Избавьтесь от live. Совсем.

   $('a').live('click', function() {...                 // плохо

   $(document).on('click', 'a', function() {...         // супер


•Замените bind на on/delegate

   $('.vote').click(function() {...                     // плохо

   $('#content').on('click', '.vote', function() {...   // хорошо
Слишком много on/delegate
Симптомы:
•задержка между событием и реакцией на него;
•большое количество вызовов $.fn.is в профайлере.

Оптимизация:
•отсекать лишние on/delegate;
•использование bind вместо on/delegate.
Повторяющиеся события
Симптомы:
•«тормоза» в момент ресайза, скролла или интенсивного ввода текста;
•профайлер показывает большое количество вызовов обработчиков
событий keydown, scroll, resize и т.п.

Оптимизация:
•Группировка нескольких вызовов события в один путем применения
декораторов debounce и throttle.
   benalman.com/projects/jquery-throttle-debounce-plugin/
debounce
$.debounce
•Группирует повторяющиеся события интервал между которыми меньше
определенного значения.

  события:

  обработчик:
throttle
$.throttle
•Группирует события которые были вызваны в пределах одного
интервала.

  события:

  обработчик:
Оптимизация $(element)
Симптом:
•профайлер показывает существенную трату времени на $(element).

Оптимизация:
•использовать один общий jQuery–объект для всех элементов внутри
each/map;
•quickEach.
// создаем общий jQuery-объект за пределами map/each:
var a = $([0]);

$('a').each(function() {
         // подставляем текущий элемент в объект
         a[0] = this;

        // и используем его как обычный $(this)
        // ...
});
Недостаток:
•Нельзя использовать во вложенных асинхронных функциях.

   var a = $([0]);

   $('a').each(function() {
        a[0] = this;

         a.click(function() {
              // всегда будет выводиться текст последней ссылки
              alert(a.text());
         });
   });
Оптимизация создания элементов
Симптом:
•профайлер показывает, что много времени уходит на $(html), append,
prepend, before, after и т.п.
1. Клонирование быстрее создания
   // создание
   var soldiers = $.map(names, function(name) {
        return $('<div class="soldier"><span>' + name + '</span></div>');
   });

   // клонирование
   var bobaFett = $('<div class="soldier"><span>Boba</span></div>');
   var name = bobaFett.find('span');

   var soldiers = $.each(names, function(name) {
        name.text(name);
        return bobaFett.clone();
   });
2. Минимизируйте число операций вставки в DOM
   // вставка сразу после создания
   $.each(messages, function(_, text) {
        $('#history').append('<div class="message">' + text + '</div>');
   });

   // вставка пакетом
   var fragment = $(document.createDocumentFragment());

   $.each(messages, function(_, text) {
        fragment.append('<div class="message">' + text + '</div>');
   });
   $('#history').append(fragment);
Restyle, layout, paint
Restyle:
•пересчет стилей не меняющих геометрию объектов.
Layout:
•пересчет геометрии.
Paint:
•перерисовка после пересчета свойств и геометрии.
Restyle, layout, paint
• Изменения откладываются на потом;
• иногда браузер вынужден применить изменения досрочно:
    –   offsetTop/Left/Width/Height
    –   scrollTop/Left/Width/Height
                                                jQuery.fn.css
    –   clientTop/Left/Width/Height
    –   getComputedStyle(), currentStyle [IE]


• время restyle, layout, paint сильно зависит от разметки.
$('div').click(function() {
    var e = $(this);

      e.css('color', e.css('backgroundColor'));

      e.css('width', 100);

      e.css('font-size', 20);

      return false;
});
$('div').click(function() {
    var e = $(this);

      e.css('width', 100);

      e.css('color', e.css('backgroundColor'));

      e.css('font-size', 20);

      return false;
});
Оптимизация .css
• Проводить операции с элементами с display: none, либо до вставки в
  документ;
• заменить несколько css на add/removeClass;
• группировать запросы CSS-свойств в начале функции (когда очередь
  restyle и layout пуста);
• не чередовать запросы и установку CSS у элемента.
Инициализация по требованию
Показания к применению:
•При загрузке страницы одновременно инициализируются множество
одинаковых контролов (модулей, плагинов).

Оптимизация:
•Инициализировать каждый контрол в момент первого обращения к
нему.
Повышение отзывчивости
Симптом:
•В момент выполнения ресурсоемкого кода браузер плохо реагирует
внешние воздействия.

Оптимизация:
•Откладывать трудоемкие итерации через setTimeout.
Общие рекомендации
• Кешируйте все, что может пригодиться;
• отсекайте лишние выборки, инициализацию плагинов и модулей, на
  страницах, на которых они точно не нужны;
• медленный JavaScript — далеко не единственная и не всегда главная
  причина «тормозов» на сайте;
• не бойтесь пересматривать требования.
Владимир Журавлев
Evil Martians




private.face@gmail.com
github.com/private-face
@private_face
Профилирование и оптимизация jQuery–кода

Weitere ähnliche Inhalte

Was ist angesagt?

Опыт разработки эффективного SPA
Опыт разработки эффективного SPAОпыт разработки эффективного SPA
Опыт разработки эффективного SPAEugene Abrosimov
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС2ГИС Технологии
 
QA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQAFest
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работыPaul Stashevsky
 
Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1Technopark
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Pavel Tsukanov
 
Selenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.euSelenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.euAndrei Solntsev
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюГлеб Тарасов
 
CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению
CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлениюCodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению
CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлениюCodeFest
 
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.Глеб Тарасов
 
Drupal 7 deploy database updates
Drupal 7 deploy database updatesDrupal 7 deploy database updates
Drupal 7 deploy database updatesAnton Ivanov
 
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Roman Dvornov
 
Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressRuslan Begaliev
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работыPaul Stashevsky
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн2ГИС Технологии
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8Technopark
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Yandex
 

Was ist angesagt? (20)

Опыт разработки эффективного SPA
Опыт разработки эффективного SPAОпыт разработки эффективного SPA
Опыт разработки эффективного SPA
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
 
QA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профи
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
 
Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
 
Selenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.euSelenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.eu
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
 
CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению
CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлениюCodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению
CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению
 
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
 
Drupal 7 deploy database updates
Drupal 7 deploy database updatesDrupal 7 deploy database updates
Drupal 7 deploy database updates
 
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
 
Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPress
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работы
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»
 

Ähnlich wie Профилирование и оптимизация jQuery–кода

Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from JqueryMagento Dev
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
jQuery. Введение и практика
jQuery. Введение и практикаjQuery. Введение и практика
jQuery. Введение и практикаSlava Aliev
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_schoolITmozg
 
Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkGeorgy Turevich
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
Мульти-доменность в Django проекте
Мульти-доменность в Django проектеМульти-доменность в Django проекте
Мульти-доменность в Django проектеAlexey Kinyov
 
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Компонентная разработка на Stylus, Jade, Typescript - Леонид ШирмановКомпонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Компонентная разработка на Stylus, Jade, Typescript - Леонид ШирмановMoscowJS
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionМ. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionAlbina Tiupa
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПKirill Chebunin
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionAlbina Tiupa
 
Алексей Горобец - Building Drupal Distributions. Why? When? and How?
Алексей Горобец - Building Drupal Distributions. Why? When? and How?Алексей Горобец - Building Drupal Distributions. Why? When? and How?
Алексей Горобец - Building Drupal Distributions. Why? When? and How?LEDC 2016
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview ReleaseDenis Shestakov
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruYandex
 

Ähnlich wie Профилирование и оптимизация jQuery–кода (20)

Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
jQuery. Введение и практика
jQuery. Введение и практикаjQuery. Введение и практика
jQuery. Введение и практика
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend Framework
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Мульти-доменность в Django проекте
Мульти-доменность в Django проектеМульти-доменность в Django проекте
Мульти-доменность в Django проекте
 
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Компонентная разработка на Stylus, Jade, Typescript - Леонид ШирмановКомпонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionМ. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с Codeception
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с Codeception
 
Алексей Горобец - Building Drupal Distributions. Why? When? and How?
Алексей Горобец - Building Drupal Distributions. Why? When? and How?Алексей Горобец - Building Drupal Distributions. Why? When? and How?
Алексей Горобец - Building Drupal Distributions. Why? When? and How?
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 

Профилирование и оптимизация jQuery–кода

Hinweis der Redaktion

  1. И так часто случается, что в один прекрасный момент, когда объем js кода или количество одновременно подключенных на странице плагинов превышает некий критический порог. И сайт начинает жутко тормозить.
  2. Страница начинает при загрузке залипать, анимация проигрывается рывками, возникают непонятные задержки между событием и реакцией на это событие. И это проблема.
  3. и этим зарабатывает себе пару профессиональных заболеваний. вы их наверняка знаете.
  4. Вадим, есть хорошие новости для нас? Как раз для таких случаев существуют жаваскриптовые профайлеры
  5. Рекомендую послушать доклад Артемия Ломова «Быстрый удар точно в цель» сегодня в 15.30. Там артемий подробно расскажет как более лучше писать селекторы.
  6. Однако увлекаться делегированием тоже не стоит. Потому что при большом количестве делегированных событий вы можете столкнуться с другой проблемой.
  7. И раз мы заговорили. Самое время рассказать про то, как происходит рендеринг страницы в браузере. О процессах
  8. стрелочка
  9. стрелочки
  10. разъезжающаяся текстарея, плейер, скрытые элементы