- PVSM.RU - https://www.pvsm.ru -
Не так давно мне довелось выступать на конференции FFConf [1] с докладом «Вам следует использовать <впишите нужную библиотеку/фреймворк>, это самое лучшее!». И основные мысли я решил изложить в публикации, в надежде, что это спровоцирует в профессиональной среде более широкую дискуссию о «стоимости» современных фреймворков на мобильных устройствах.
Для желающих обратиться к оригиналу моего выступления вот видео:
и слайды презентации: speakerdeck.com/paullewis/framework-here-its-the-bestestest [2].
В начале года я писал о зависимости производительности фреймворка React [3] от увеличения размера дерева, которым он оперирует (TL;DR: чем оно крупнее, тем больше задействуется вычислительных мощностей). Я получил немало откликов на эту публикацию, варьирующихся в очень широком диапазоне — от признательных и конструктивных до ярко негативных. Благодаря этой обратной связи я собрал дополнительные сведения, которые в большей или меньшей степени можно отнести ко всем фреймворкам:
Причём важнейшим фактором оказалось удобство использования — явно или неявно его отметило большинство разработчиков. Это собирательное мнение можно сформулировать так: «Если мне будет проще жить, я смогу сделать для пользователей кое-что получше». Вроде бы звучит неплохо. Но, как мне кажется, при такой позиции из виду упускается много важных моментов.
Нельзя забывать, что у пользователей есть свои нужды. В частности, такие:
Возникает неувязка: с одной стороны — удобство и комфорт разработчиков, с другой — пользовательские нужды. А поскольку фреймворки не бесплатны в плане использования ресурсов, то всё это необходимо как-то увязать друг с другом, нравится нам это или нет.
Здесь я предлагаю исключить из рассмотрения отдельные библиотеки. Ведь если с ними возникают какие-то проблемы, то их можно заменить другими. Не нравится, как библиотека задаёт формат даты? Просто подключи ещё какую-нибудь. А вот сменить фреймворк не так просто. Зачастую это требует пересборки всего приложения. К тому же фреймворки занимают куда больше места и вовлечены в приложения гораздо шире и глубже.
У каждой разработки есть своя «цена». Но я считаю, что каждый фреймворк вносит свой уникальный вклад в общую «стоимость».

Тот волшебный момент, когда фреймворк сообщает тебе о чём-то нерекомендуемом (недопустимом). Вероятно, сообщение выдала Java. Странно.
Пользователи тоже «платят» свою цену:
Учитывая всё сказанное, я предлагаю обсудить измерение некоторых из этих стоимостей. Возможно, общими усилиями нам удастся придумать, как лучше всего достигнуть компромисса по выбранным моментам. Начну со времени начальной загрузки фреймворков на смартфонах. Для тестирования я выбрал TodoMVC. Для меня это MVP веб-приложение, а с точки зрения пользователя все варианты функциональности получаются идентичными.

Я измерял следующие параметры: время, полосу пропускания и использование ЦПУ. Тесты проводились на Nexus 5 и iPhone 5S.

Я решил измерить, сколько времени уходит у каждого фреймворка:
Стоимость применения стилей, макетов, заливки и прочего я игнорировал, поскольку она не должна сильно меняться в разных реализациях TodoMVC. Также я не измерял продолжительность передачи данных.
Для загрузки страниц на Nexus 5 [5] я применял WebPagetest. Для каждого прогона создавался таймлайн-файл, который затем обрабатывался в Big Rig [6]. Результаты с iPhone я снял и обработал самостоятельно, поскольку профилирование JavaScript в Safari, судя по всему, не поддерживает экспорт трассировок и таймлайнов.

Использование Big Rig
Между прочим, поэтому я и создал Big Rig — хотелось облегчить всем нам обработку данных подобного рода.
Если вы хотите протестировать самостоятельно, например на устройстве с запущенным Chrome, то следуйте этому алгоритму:
Вот пример того, как это делаю я:
Мною получены такие данные:
| Фреймворк | Размер | Время начальной загрузки Nexus 51, 3 | Время начальной загрузки iPhone 5S2, 3 |
|---|---|---|---|
| Polymer v1.1.4 | 41 Кб5 | 409 мс | 233 мс |
| Polymer v1.2.2 | 47 Кб5 | 155 мс | 232 мс |
| AngularJS v1.4.3 | 324 Кб | 518 мс | 307 мс |
| React v0.13.3 [JSX не преобразован] | 311 Кб | 1,201 мс | 1,463 мс |
| React v0.13.3 [JSX преобразован с помощью Babel]4 | 162 Кб | 509 мс | 282 мс |
| React v0.13.3 [JSX преобразован; production-сборка]4, 6 | 160 Кб | 174 мс | 118 мс |
| Backbone v1.2.2 [включая jQuery и Underscore] | 139 Кб | 248 мс | 168 мс |
| Ember v1.10.0-beta.3 | 580 Кб | 1,992 мс | 1,440 мс |
| Vanilla | 16 Кб | 50 мс | 33 мс |
Примечания:
С моей точки зрения, выводы однозначны: на мобильных устройствах использование фреймворков сопряжено с серьёзным ростом нагрузки, особенно в сравнении с написанием обычного JavaScript. Наилучшие результаты показал Polymer 1.2.2, но даже он оказался в три раза медленнее «ванильки». React по скорости сравним с Polymer, но у меня есть вопросы относительно его масштабируемости [3].
Чтобы уж совсем прояснить ситуацию, отмечу:
Вероятно, какие-то моменты проведённого тестирования могут вызвать возражения, на которые необходимо дать ответ:
И неизбежно возникает вопрос: а нужно ли использовать фреймворк? Я не могу дать на него ответ. Это должно быть целиком ваше собственное решение. Существует миллион причин, почему вам позарез нужен фреймворк. Вот мои собственные мысли по этому поводу:
Да, фреймворки предлагают разработчику немалый комфорт. Но я не могу отделаться от мысли, что лучше вложиться в собственные знания и навыки в рамках самой веб-платформы. Фреймворки приходят и уходят, они словно приливы и отливы интернета, помогающие реализовать и отточить идеи и шаблоны. Но если вы однажды обнаружите, что ваш любимый фреймворк больше не работает или какой-то важный баг так и не пофиксили, то способность разобраться в устройстве платформы окажет вам неоценимую услугу.
Я как-то писал, что комфорт разработчика менее важен, чем нужды пользователей. Я всё ещё верю в это. Хоть меня тоже привлекает лёгкая жизнь, я не хочу создавать плохо работающие продукты. И не хочу, чтобы пользователи платили за них высокую «цену». Сейчас меня волнует скорость начальной загрузки фреймворков на мобильных устройствах. Но это лишь первый шаг. Есть и другие метрики: использование памяти, длительная нагрузка на ЦПУ, частота смены кадров. В целом нам нужно искать менее затратные для пользователей решения.
Если нам удастся реализовать быстро загружаемые фреймворки, потребляющие мало памяти и работающие с большим фреймрейтом, да ещё и обеспечивающие комфортность разработки, то это было бы идеально. Но до той поры я бы предпочёл использовать обходиться без фреймворков, по крайней мере в мобильном сегменте.
Автор: Mail.Ru Group
Источник [10]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/106888
Ссылки в тексте:
[1] FFConf: http://2015.ffconf.org/
[2] speakerdeck.com/paullewis/framework-here-its-the-bestestest: https://speakerdeck.com/paullewis/framework-here-its-the-bestestest
[3] производительности фреймворка React: https://aerotwist.com/blog/react-plus-performance-equals-what/
[4] пользователям нравится плавность работы интерфейса: https://paul.kinlan.me/what-news-readers-want/
[5] Nexus 5: https://webpagetest.org/
[6] Big Rig: https://aerotwist.com/blog/bigrig/
[7] WebPagetest: http://webpagetest.org/
[8] дискуссию относительно объёмов передачи данных на сайте Filament Group: https://www.filamentgroup.com/lab/mv-initial-load-times.html
[9] Пол Айриш не так давно исследовал производительность мобильной версии сайта Reddit: https://github.com/reddit/reddit-mobile/issues/247
[10] Источник: http://habrahabr.ru/post/273613/
Нажмите здесь для печати.