Автор: Николай Хабаров, Embedded Expert DataArt, евангелист технологий умного дома.
Python идеально подходит для создания простых PoC-проектов. Всех преимуществ этого языка мы перечислять не будем, обратим внимание на особенность, которая кажется нам одной из самых интересных — кроссплатформенность. Именно благодаря ей Python оказывается очень удобным для создания встраиваемых систем. Не нужно компилировать двоичные файлы, нет необходимости заниматься развертыванием приложений. Тот же код работает как на ПК, так и на одноплатных решениях на базе Linux (например, Raspberry Pi).
Однако у этого подхода есть и свои ограничения. Он не может быть использован для некоторых проектов, требующих определенного оборудования (например, у настольных ПК может не быть и скорее всего не будет SPI, I2C и т. д.). И, конечно же, платы на базе архитектуры ARM работают медленнее, чем персональный компьютер. Поэтому в некоторых случаях алгоритм, отлично работающий на ПК, будет недостаточно производительным на встраиваемой системе.
Высокая производительность была важна для одного из наших последних проектов.
Мы использовали Dragonboard 410c в качестве одной из целевых платформ и были приятно удивлены производительностью платы. Даже без инструментального бенчмаркинга мы заметили значительно более высокую скорость при установке пакетов ОС, запуске приложений и общей производительности по сравнению с Raspberry Pi 3. Давайте посмотрим на спецификации плат:
Плата | Raspberry Pi 3 | DragonBoard 410c |
---|---|---|
Процессор | BCM2837, Quad-core ARMA53(v8) 1.2GHz |
Snapdragon 410E, Quad-core ARMA53(v8) 1.2GHz |
Память | 1GB | 1GB |
Характеристики примерно одинаковые — они не объясняют лучшую производительность DragonBoard, которую мы видели своими глазами. Поэтому мы провели тест производительности, чтобы убедиться в том, действительно ли эта плата быстрее.
Мы решили измерить на этих платах производительность Python 3 — самой интересной для нас версии этого языка программирования. Мы использовали Python Performance Benchmark Suite, который основывается главным образом на тестах производительности в реальных условиях, а не на синтетических бенчмарках, и использует существующие приложения везде, где это возможно.
Мы использовали нашу любимую ОС для встроенных платформ — Ubuntu Core 16. Это консистентная операционная система с транзакционными обновлениями, которая (что самое главное) поддерживает обе платы, принимающие участие в нашем тестировании. Мы установили Ubuntu Core на SD-карту и использовали snap «classic» для создания традиционной среды ubuntu для проведения теста.
Эта команда устанавливает Pyperformance:
pip3 install pyperformance
Для запуска мы использовали следующие параметры:
echo pyperformance run –python=python3 -o result.json | nohup sudo classic &
Тест длится достаточно долго, поэтому мы использовали эту сложную команду, чтобы тестирование выполнялось в фоновом режиме без активного ssh-соединения. Это также позволило избежать проблем, вызванных разрывом того же ssh-соединения, которое повлекло бы за собой остановку теста.
Вот что мы получили в итоге:
Результаты нас сильно удивили. Производительность DragonBoard почти в два раза выше, чем у Raspberry Pi 3! Конечно, не стоит забывать, что официальное ядро Linux для Raspberry Pi 3 имеет 32-битную архитектуру armhf (v7), а ядро DragonBoard 410c — 64-битную архитектуру amr64 (v8). Вероятно, разница производительности вызвана тем, что Python использует 64-битные вычисления.
Давайте также запустим sysbench — тест, использующий нативный код. Sysbench включает в себя несколько тестов, которые мы хотели бы запустить: cpu, memory, threads, mutex. Эти тесты относятся к более «синтетическим», но в любом случае давайте сравним чистую вычислительную мощность плат. Результаты ниже:
Тест | Raspberry Pi3 | DragonBoard 410c |
---|---|---|
cpu sysbench –test=cpu run |
318.1229s | 12.6500s |
memory sysbench –test=memory –memory-total-size=2G run |
7.5322s | 3.0507s |
threads sysbench –test=threads run |
23.1469s | 9.1600s |
mutex sysbench –test=mutex run |
0.0283s | 0.0141s |
По итогам теста cpu процессор DragonBoard 410c оказался в 25 раз быстрее Raspberry Pi. Это связано с тем, что в тесте cpu используются вычисления с 64-разрядными числами, а в таком случае 64-битная операционная система действительно имеет большое преимущество. Другие тесты показали, что производительность DragonBoard примерно в два раза выше, что в целом соответствует показателям pybenchmark. При этом нужно учесть, что 64-битное ядро не должно влиять на тестирование теста threads.
Конечно, всегда есть возможность разработать свой проект с помощью C или даже одного только ассемблера и получить лучшую производительность. Но обычно время разработки дороже стоимости платы. Использование таких инструментов, как Python, дешевле, эффективнее и производительнее. С их помощью можно создать более качественный продукт и быстрее вывести его на рынок. Снижение производительности, вызванное Python, можно легко преодолеть с помощью более мощной платы. Мы очень надеемся, что официальные мэйнтейнеры выпустят 64-битную версию ядра Raspberry Pi, но на сегодня идеальным выбором для разработки встраиваемых приложений на Python остается DragonBoard 410c.