DroidScript
DroidScript
инструменты для мобильной разработки

Быстродействие

Базовый курс программирования на Thunkable X  
06.11.2019

Вопросы быстродействия и оптимизации обычно выносят за рамки основ, но применительно к Thunkable X об этой проблеме должен знать каждый пользователь. Возможно, Thunkable X не является чемпионом по эффективности оптимизации блоков, но, если ничего не подозревающий разработчик будет руководствоваться официальной документацией, то с вероятностью 100% некоторые его блоки будут работать в несколько тысяч раз медленнее тех блоков, которые на самом деле нужно использовать. Какой С++ и многопоточность? Вы о чём? Всего-то и нужно вместо одного блока использовать другой! Это не превратит бобра в гепарда, но позволит точнее очертить границы возможного использования мобильных приложений на Thunkable X

На первый взгляд кажется то, что ничего в блоках переменных нет, но это не так. Помните, как на первом занятии прозвучала рекомендация не использовать блоки глобальных переменных, потому что они не во всех ситуация работают стабильно, загрязняют пространство имён и могут очень сильно замедлить работу в редакторе блоков? Существует и ещё одна причина – невозможно медленная скорость их работы.

Соберём испытательный стенд в виде следующего блока.

Функция для оценки производительности

Тестирование происходило на Android 8.1 (MTK6739WA, 4 ядра, 1.3 ГГц).

Время работы показанного цикла составляет примерно 8.111 секунды. Если блок “app LoopCount” заменить на блок переменной функции, то выполнение цикла составит 0.009 секунды – в тысячу раз быстрее! Метод LocalDB.setCell выполняется в 10 раз быстрее и является неплохой альтернативой, так как в отличие от блока app-переменных не имеет проблем при работе с объектами.

В последнем обновлении разработчикам удалось увеличить скорость работы некоторых блоков в 2 раза, но этого недостаточно.

Скорость выполнения 100 операций в секундах:


set x to = 10 - 0.001
set app to = 10 – 1.271
set stored to = 10 – 0.889
set cloud to = 10 – 3..10
Label.setText = "Hello" – 2.314
Any Label.setText = "Hello" – 2.188
x = Label.getText – 0.044
x = Any Label.getText – 0.036
Button.setWidth = 100 – 2.064
x = Button.getWidth – 0.038
Alert.setTitle – 2.201
LocalDB.setCell – 0.108
x = LocalDB.getCell – 0.011
х = 10 + 3 – 0.002
join "Hello" и "world" – 0.002
If < i = true – 0.001
Create object – 0.001
do something – 0.029
Get property – 0.043
Clone Label – 6.766
Create Label – 6.517
Create Button – 18.309
Create Text Input – 10.746
Create Switch – 7.586
Create Slider – 8.184
Create Row – 4.568
Create Column – 12.845
Create Image – 8.651
in List insert at last – 0.03
in ListViewer insert at last - 0.247

Блоки set работают в несколько раз медленнее блоков get, а при использовании элементов интерфейса – в несколько десятков раз медленнее! Это говорит о невысокой скорости вывода компонентов UI на экран.

Блоки create и clone – это одни из самых “тяжелых”. С их помощью невозможно создать расширенный многострочный список с изображениями. Предположим, один элемент списка состоит из 5 компонентов. Тогда для создания списка из 10 строк потребуется создать копированием 45 компонентов, что займёт порядка 5 секунд, после чего пользователи отправят такое приложение в мусорную корзину.

Вызов пустой функции происходит в 10-20 раз медленнее создания пустых объектов. Заполнение данных ListViewer также происходит в 10 раз медленнее заполнение списка List.

Самым медленным блоком из переменных является блок set cloud to, потому что при этом происходит вызов Fiorebase. А среди блоков компонентов самым медленным является блок создания кнопки. За 1 секунду создаётся всего 5 кнопок!

Компонент Row создаётся более чем в 2 раза быстрее компонента Column.

Хорошо, но на iOS-то это будет работать быстрее! Да, на iPhone6 всё работает в 2.5 раза быстрее, но это никак не решает проблему, та как список всего из 10 строк с тремя текстовыми полями и одной пиктограммой в каждой строке даже на iPhone6 будет отображаться 2 секунды! Хорошо, а сколько времени занимает создание 100 кнопок на JavaScript в WebViewer? 9 микросекунд. 100 "нативных" кнопок за 18 секунд или 100 web-кнопок за 9 микросекунд?

Всё сказанное выше говорит о том, что ядро Thunkable X будет работать очень медленно даже на самых мощных устройствах. Вы можете увеличить скорость выполнения отдельных блоков, но на общую производительность это повлияет незначительно. Частично это можно решить за счёт появления новых компонентов, но для этого нужно ускорить их выпуск, чего, к сожалению, мы не наблюдаем.

Базовый курс программирования на Thunkable X  
© 2016-2018 Александр Страшко