Java, ASM.js или собственный — что быстрее?


Вы можете подумать, что уже знаете ответ на вопрос, поставленный в заголовке, но некоторые недавние исследования Mozilla могут вас удивить.

Mozilla во многом зависит от успеха своей мобильной операционной системы Firefox OS. Поскольку все приложения, работающие под управлением Firefox OS, используют JavaScript и, по крайней мере, в настоящее время нет встроенного кода, важно, чтобы JavaScript был быстрым. Последняя идея состоит в том, что любое приложение, которое находит JavaScript слишком медленным, должно использовать asm.js — подмножество JavaScript, которое можно оптимизировать.

Каннан Виджаян в блоге Mozilla решил выяснить, насколько быстро asm.js сравнивается с Java, работающей на виртуальной машине Dalivik, и C ++, скомпилированным в собственный код, все, конечно же, на Android. Он взял некоторые компоненты теста SunSpider:

бинарные деревья — доступ и манипулирование данными

3D-морфинг — 3D графика

частичные суммы — математика

fasta — струны

спектральная норма — математика

nsieve — доступ и манипулирование данными

nbody — доступ и манипулирование данными

Каждый был преобразован из JavaScript в Java и C ++. Версия Java была скомпилирована для работы под Android Dalvik. C ++ соответствовал собственному коду ARM и использовал emscripten для asm.js. Обратите внимание, что asm.js не создавался вручную для теста.

Приложение Java / Dalvik запускалось как стандартное приложение на Nexus 4. asm.js запускался в Firefox Nightly, а собственный код запускался как приложение NDK. Программы выполнялись в течение нескольких итераций, и обратное время выполнения масштабировалось так, чтобы программа Dalvik имела оценку 1 во всех случаях.

Результаты интересны:

Самый большой шок заключается в том, что версия Java / Dalvik работает так плохо — помните, чем больше полоса, тем меньше время выполнения. В тесте двоичных деревьев asm.js работает лучше, чем собственный код C ++. Виджаян предполагает, что это как-то связано со способом выделения объектов в C ++ с использованием malloc по сравнению с методом asm.js, использующим типизированный массив в качестве пула памяти.

Это кажется разумным. Вы могли бы сказать, что ни один хороший программист на C ++ не стал бы писать программу для создания и уничтожения объектов, но заметьте, что программа asm.js также не была оптимизирована вручную. В сообщении блога излагаются причины огромных преимуществ, которые нативный код и asm.js имеют перед Java в более быстром тесте, а также для всего поведения во всех других тестах.

Окончательные выводы заключаются в том, что asm.js конкурирует с собственным кодом и с Dalvik, что является хорошей новостью для Firefox OS.

Конечно, везде, где есть тесты, есть программисты, готовые поспорить — и следует признать, что это далеко не лучший вариант для asm.js. Несомненно, с некоторыми настройками код Dalvik можно было бы ускорить, как и собственный код. Что интересно, asm.js был создан не из JavaScript, а из C ++. Для asm.js еще довольно рано, и он тоже мог бы стать лучше — это гонка вооружений, а не финишная черта.

Кстати, о JavaScript, где, как вы думаете, он может появиться?

Ответ:

На этом этапе вы можете сделать вывод, что нет особого смысла использовать что-либо, кроме старого доброго JavaScript, который явно не уступает любому другому. Это, конечно, неправильный вывод. Как выразился Виджаян

Несколько печальный факт заключается в том, что оценки SunSpider были «протестированы» без всяких оснований. Все движки Javascript, включая SpiderMonkey, используют такие оптимизации, как трансцендентные математические кеши (кеш для таких операций, как синус, косинус, тангенс и т. Д.), Чтобы улучшить свои оценки SunSpider.

Обратите внимание, что это не делает недействительными результаты для Dalvik, asm.js и собственного кода. Также обратите внимание, что asm.js и собственный код были сгенерированы из одного и того же источника C ++, что делает сравнение намного ближе.


Добавить комментарий