Почему в настольном приложении Slack, скорее всего, есть драйвер для работы игрового контроллера Xbox и чего, действительно, плохого в использовании Electron для построения настольных приложений.
На скриншоте ниже, согласно профайлеру, Slack занимает почти все ресурсы процессора. Интересно, чем это он там занимается?
Процесс был запущен в фоне когда это произошло. Я даже не взаимодействовал со Slack — я был на встрече. И заметил я это только из-за шума системы охлаждения моего ноутбука. Перезапуск Slack в этот раз решил проблему.
Но это нормально для Slack. В фоновом режиме Slack часто потребляет 5% процессора. Что он делает? Я без понятия.
Я готов поспорить, что команда разработчиков Slack тоже не знает. Сколько тысяч строк кода им пришлось написать чтобы их клиент работал? Я думаю в районе 50. Возможно, 100. Но Slack — не нативное приложение. Или не обычное нативное приложение. Он работает поверх Electron, а это значит, что когда вы его скачиваете, вы на самом деле скачиваете полную копию Google Chrome (скорее, Chromium — прим. пер.). Chrome на момент написания содержит 15 миллионов строк кода, не являющимися комментариями. Код непосредственно Slack составляет менее 1% объема загрузки.
Chrome сам по себе — тот ещё боров. Он большой и сложный. Он использует ОЗУ и процессор как будто больше на них никто не претендует и сильно уменьшает время жизни от батареи.
Вы можете думать о Slack как о маленькой программе на JavaScript, которая работает внутри другой операционной системы (виртуальной машины) Chrome, которую вы запускаете чтобы, в сущности, пользоваться аналогом IRC. Даже если сам Chrome у вас уже запущен, то каждое приложение на Electron разворачивает свою, дополнительную копию.
И называть Chrome операционной системой — это не преувеличение. По количеству строк кода Chrome практически такого же размера как ядро Linux. Как и у ядра Linux у него есть API для различного оборудования, включая OpenGL, VR, MIDI. Он содержит встроенную копию SQLite, систему управления памятью и свой собственный диспетчер задач. На macOS в нём даже есть драйвер USB для игрового контроллера Xbox 360. (Я знаю что он там, потому что я его и написал. Извините.)
Содержит ли Slack мой код для контроллера Xbox? Знает ли команда Slack об этом? Знает ли об этом хоть кто-то? Slack занимает 160 Мб на диске. Это порядка 70 несжатых копий Властелина Колец. Другие приложения Electron на моем компьютере — Spotify (200 Мб) и Atom (260 Мб). Linux я впервые установил при помощи дискет. Понадобится 450 дискет, чтобы записать эти три простых приложения. Все вместе они весят как настольный дистрибутив Ubuntu. Который, думаю, содержит в себе клиент IRC, текстовый редактор и музыкальный проигрыватель. Полноценная операционная система, пользовательское окружение и веб-браузер.
Вы скажете, что дисковое пространство сейчас ничего не стоит. Да, но не оперативная память. Новенький блестящий MacBook Pro по умолчанию укомплектован 8 Гб ОЗУ. В связи с продолжительностью работы от батареи вы не можете приобрести модель с более чем 16 Гб. И прямо сейчас Slack находится где-то между 300 Мб и 1 Гб в памяти моего ноутбука:
Come on. Это приложение для обмена текстом.
Другая вещь, которой всегда не хватает — заряд батареи. Современные процессоры сохраняют заряд путём остановки когда это возможно (когда нет никаких задач). Проклятие power management это программы, которые постоянно используют процессор всего на пару процентов. Они заставляют процессор постоянно просыпаться, разгоняться и снова останавливаться. Это идеальный способ уничтожить драгоценный заряд батареи. Если у кого-то есть время (просто оставьте их запущенными) — я бы посмотрел как сильно Spotify, Slack и Atom уменьшают время работы от батареи на современных ноутбуках. Это невероятно.
И нет, Spotify не проигрывает музыку. Он просто… запущен. Делает свои загадочные хромовские дела. И он тоже использует несколько процентов процессора. Просто, чтобы существовать.
(Во время написания этой заметки Chrome в отместку решил занять 100% ресурсов процессора. Во встроенном диспетчере задач это был загадочный процесс «Browser». Спасибо, Chrome.)
Если быть честным, то JavaScript вне браузера не является проблемой. На самом деле я думаю, что API, которые предоставляет современный веб гораздо лучше существующих API операционных систем. Мы должны ими пользоваться.
Но нам необходимо найти возможность использовать эти новые парадигмы (React и его друзья) на настольных платформах без необходимости запускать больше чертовых копий Chrome. Мне просто не настолько интересно ваше приложение, чтобы это оправдывало запуск очередного инстанса Chrome. Разработчику легко попасть в ловушку ощущения того, что ваше приложение или сайт это подарок человечеству и самое важное, чем они могут заниматься. Почему бы не воспользоваться избыточными ресурсами? Нам нужно бороться с таким образом
Просто скажите Electron НЕТ
Разработчики, не позволяйте своим друзьям писать приложения на Electron. Если вы хотите использовать JS и React — воспользуйтесь React Native. Это как Electron, но только у вас нет необходимости распространять копию Chrome всем пользователям и запускать ещё одну копию Chrome чтобы использовать ваше приложение. Оказывается, современные операционные системы уже имеют хорошие и быстрые UI библиотеки. Используйте их, олухи!
Другой печальный факт это то, что даже многие разработчики и понятия не имеют что происходит в их компьютерах. Они пользуются Slack, но не знают насколько он прожорлив. Это твоя ответственность, как разработчика, знать всё это. Практикуйтесь. Изучите средства для профилирования. Воспользуйтесь iStatMeters или одним из бесплатных аналогов. Вы не можете улучшить то, что не измеряете.
Может, мы должны покупать более медленные компьютеры, чтобы почувствовать боль. Facebook намеренно ограничивала скорость интернета в своих офисах раз в неделю, чтобы вызвать сочувствие их пользователям в других странах третьего мира (кхе-Австралия-кхе). Может, как разработчики, мы должны тоже делать это со своими компьютерами, например, заставлять код работать гораздо медленнее, чем обычно, чтобы вооружиться интуицией в отношении производительности. Пару лет назад я оставил свой ноутбук на работе на долгие выходные. Вместо поездки за ним я решил подключить мой Raspberry Pi (чертовски медленное 1 поколение) и использовать его для разработки. Внезапно, множество операций, которые осуществлялись мгновенно на моём обычном ноутбуке с i7 стали ужасно медленными. И я потратил выходные, чтобы сделать свой рабочий процесс более гладким. Все эти твики производительности также переносятся и на обычные устройства. Уменьшение времени запуска с 5ти секунд до 2х на Raspberry Pi ощущалось невероятным прыжком. Это исправление точно так же стало прыжком с 0.5 секунд до 0.2 или вроде того. Это всё равно очень заметно для пользователя. Время запуска в 0.5 секунд достаточно мало, чтобы упустить этот факт при разработке, но падение до 0.2 очевидно ощущается как намного быстрее.
Пользователи: Пожалуйста, жалуйтесь на медленные программы. На дворе 2016 год (… — прим. пер.). Мы носим суперкомпьютеры в наших карманах. Для программ недопустимо быть медлительными.
Разработчики: Производительность имеет значение. Память имеет значение. Мне не важно, что ты самая привлекательная девушка на танцполе, Slack. Я закрываю тебя как только покидаю офис. Я удаляю тебя с компьютера как только имею такую возможность. Медлительность это баг. Самая быстрая программа это та, которую ты не запускаешь. Так что хватит встраивать целый Chrome в своё приложение.
И все вы, веб-разработчики: Выучите С или Rust или что-то в этом духе. Ваши программы выполняются на компьютере. Пока вы не знаете как работает компьютер вы обречены. И убирайтесь с моей лужайки пока не узнаете! *трясёт кулаком*
И да, почитайте про кризис ожирения сайтов (перевод на Habr). Это очень смешно. И очень грустно. И очень жизненно.
Edit: Spotify на самом деле использует Chromium Embedded Framework вместо запуска через Electron. Но он всё равно встраивает Chrome. Я не знал об этом когда писал статью, но не забираю свои слова по поводу конечной производительности.
Автор: nuc134r