Electron против нативных приложений: реальна ли разница в производительности?

Сравнение производительности Electron и нативного приложения

На протяжении многих лет в сообществе разработчиков программного обеспечения не утихают жаркие споры: Electron против Native. Современные настольные гиганты, такие как Visual Studio Code, Slack, Discord и Teams, построены на базе Electron — фреймворка, который позволяет разработчикам создавать кроссплатформенные настольные приложения с использованием веб-технологий.

В то же время пользователи и разработчики часто жалуются на то, что приложения на базе Electron являются “раздутыми”, “медленными” и “пожирающими оперативную память”. С другой стороны находятся нативные приложения, написанные специально для целевой операционной системы (с использованием Swift/Objective-C для macOS, Kotlin/C# для Windows/Android и C++/Qt для Linux).

Так реальна ли разница в производительности? Или это преувеличение? В этой статье мы подробно рассмотрим архитектуру, использование памяти, время запуска и ресурсоемкость обоих подходов, чтобы выяснить это.


1. Архитектурный план: ключевое отличие

Чтобы понять разницу в производительности, мы должны сначала посмотреть на то, как эти приложения работают изнутри.

Electron: веб-браузер в коробке

Приложение на базе Electron — это, по сути, упакованный экземпляр Chromium (браузера с открытым исходным кодом, лежащего в основе Google Chrome) в сочетании со средой выполнения Node.js.

  • Основной процесс запускает среду Node.js, управляя жизненным циклом приложения и системными взаимодействиями.
  • Процессы рендеринга запускают экземпляры Chromium, отображая пользовательский интерфейс так же, как веб-страницу.

Это означает, что при запуске одного приложения Electron вы одновременно запускаете веб-браузер и бэкенд-сервер.

Нативные приложения: прямое обращение к оборудованию

Нативные приложения компилируются непосредственно в машинный код или нацелены на оптимизированные виртуальные машины (такие как JVM или .NET CLR), которые работают с минимальными затратами ресурсов. Они используют нативный движок рендеринга пользовательского интерфейса ОС (например, Cocoa в macOS или WinUI в Windows) вместо рендеринга HTML внутри контейнера браузера.


2. Потребление памяти (дебаты об оперативной памяти)

Наиболее распространенной критикой в адрес Electron является использование памяти. Эта разница на 100% реальна и измерима.

  • Базовый уровень Electron: Пустое, только что инициализированное приложение Electron обычно потребляет от 80 МБ до 120 МБ оперативной памяти. Это связано с тем, что приложение должно загрузить движок рендеринга Chromium, движок JavaScript (V8) и Node.js в память еще до того, как отобразит хотя бы один пиксель пользовательского интерфейса.
  • Базовый уровень нативных приложений: Нативное настольное приложение, созданное с помощью Swift (для macOS) или C++ (для Windows), может легко запускаться и работать, потребляя менее 10–15 МБ оперативной памяти.

Когда вы масштабируете это до повседневного использования, запуск трех или четырех приложений Electron (например, Slack, Discord, VS Code и Spotify) может легко потребовать от 1,5 ГБ до 2 ГБ оперативной памяти только для поддержания активности их сред выполнения. Для пользователей с 8 ГБ оперативной памяти это создает значительное узкое место в производительности.


3. Время запуска и скорость выполнения

Скорость «холодного» запуска

Поскольку Electron должен запустить движок браузера и инициализировать контекст Node.js, он страдает от заметной задержки при «холодном» запуске. Это время запуска обычно составляет от 1 до 3 секунд. Нативные приложения, не имеющие таких накладных расходов на инициализацию среды выполнения, запускаются практически мгновенно (часто за 100–300 миллисекунд).

Выполнение и нагрузка на процессор

Chromium использует движок Google V8 для компиляции JavaScript в машинный код «на лету» (JIT). Хотя V8 невероятно быстр для движка JavaScript, он не может сравниться с чистой скоростью нативного кода, скомпилированного заранее (AOT) (например, C++ или Swift).

Кроме того, поскольку Electron полагается на язык с автоматической сборкой мусора (JavaScript), пользователи будут время от времени сталкиваться с микрофризами, когда сборщик мусора очищает неиспользуемую память. Нативные языки, такие как C++, используют ручное управление памятью, а Swift использует автоматический подсчет ссылок (ARC), что позволяет избежать пауз на сборку мусора.


4. Размер пакета (объем на диске)

Размер установщика приложения — еще один разительный контраст:

  • Electron: Поскольку каждое приложение Electron должно включать в себя Chromium и Node.js, минимальный размер загрузки составляет около 50–80 МБ, а на диске приложение распаковывается до более чем 150 МБ.
  • Нативные приложения: Нативному приложению не нужно упаковывать среду выполнения, поскольку оно использует встроенные библиотеки ОС. Полностью функциональная нативная утилита может легко весить менее 5 МБ.

5. Если нативные приложения лучше, почему Electron так популярен?

Несмотря на все эти недостатки производительности, почему гиганты индустрии все равно выбирают Electron?

  1. Скорость разработки: Написание кода один раз на HTML/CSS/JavaScript и его развертывание на macOS, Windows и Linux экономит компаниям миллионы на затратах на разработку.
  2. Пул талантов: Веб-разработчиков (HTML/CSS/JS) гораздо больше, чем нативных разработчиков под macOS (Swift) или Windows (C++).
  3. Согласованный интерфейс: Electron гарантирует, что ваше приложение будет выглядеть и вести себя абсолютно одинаково во всех операционных системах.

Заключение: реальна ли разница в производительности?

Да, разница в производительности между приложениями Electron и нативными приложениями очень реальна. Нативные приложения бесспорно быстрее, потребляют лишь малую часть памяти, запускаются быстрее и занимают меньше места на диске.

Однако для многих компаний эффективность разработчиков, скорость вывода продукта на рынок и кроссплатформенная согласованность, предлагаемые Electron, перевешивают эти затраты на производительность. Как для разработчика, так и для пользователя выбор сводится к компромиссу: удобство и скорость разработки против эффективности использования ресурсов и чистой скорости.


Читайте больше технических сравнений в блоге Ghaznix →