Emscripten и ASM.js
Nov. 14th, 2014 11:00 pmНу что ж, друзья мои, по крайней мере в Firefox'e для числодробилок в браузере нет языка лучше, чем С++. Но только там, правда.
Задействовал сегодня Emscripten :: С++ -{clang/LLVM}-> ASM.js.
Чтобы его поставить уж было расчехлил свой линукс, но оказалось, что проще всего его поставить как раз в винде: установка в один клик, и все сразу работает из коробки. Использовать С++ код из JS оказалось весьма просто, когда разберешься что к чему. Ключевой момент: ASM.js работает в пределах одного единственного массива фиксированной длины. Просто так передать ему пару других массивов из JS не выйдет, нужно выделять для них память в этой вот куче ASM.js, копировать туда, потом оттудова читать результат. В Firefox'e компиляцией ASM.js кода занимается отдельный специализированный ahead of time конпелятор, в то время как остальные браузеры относятся к нему как к обычному JS.
В итоге на тесте с декодированием картинки на моем ноуте текущая ситуация такая (время декодирования в миллисекундах и размер кода):
Погонять ASM.js. Все тесты.
Успел даже на малюсеньком тесте столкнуться с разницей браузеров в исполнении/неисполнении JS: что работало в Хроме, падало в Firefox'e: он видите ли не дает responseType у XHR устанавливать до вызова open(). А сгенеренный Haxe'ом код не взлетел в IE: не могу, говорит, скастить HTMLInputElement в HTMLInputElement (хвала динамической типизации, где сравнение типов может делать что угодно кроме того, что надо!).
Итого, если ориентироваться на Firefox, то рулит С++ и ASM.js, в Хроме рулит чистый JS (который фактически и получается из Haxe), а если нужно, чтобы был компактный код, который стабильно и шустро работает везде, то по-прежнему рулит Flash. Ну а если еще про айфоны всякие вспомнить, то... проще плюнуть и никогда больше к этому проклятому болоту, фронтэнду, не приближаться.
Задействовал сегодня Emscripten :: С++ -{clang/LLVM}-> ASM.js.
Чтобы его поставить уж было расчехлил свой линукс, но оказалось, что проще всего его поставить как раз в винде: установка в один клик, и все сразу работает из коробки. Использовать С++ код из JS оказалось весьма просто, когда разберешься что к чему. Ключевой момент: ASM.js работает в пределах одного единственного массива фиксированной длины. Просто так передать ему пару других массивов из JS не выйдет, нужно выделять для них память в этой вот куче ASM.js, копировать туда, потом оттудова читать результат. В Firefox'e компиляцией ASM.js кода занимается отдельный специализированный ahead of time конпелятор, в то время как остальные браузеры относятся к нему как к обычному JS.
В итоге на тесте с декодированием картинки на моем ноуте текущая ситуация такая (время декодирования в миллисекундах и размер кода):
Chrome 38: Firefox 33: IE 11: Size:
Flash 57 58 58 6 KB
Dart to JS 60 70 95 135 KB
C++ to ASM.js 54 43 149 212 KB
Haxe to JS 52 49 fail 12 KB
Погонять ASM.js. Все тесты.
Успел даже на малюсеньком тесте столкнуться с разницей браузеров в исполнении/неисполнении JS: что работало в Хроме, падало в Firefox'e: он видите ли не дает responseType у XHR устанавливать до вызова open(). А сгенеренный Haxe'ом код не взлетел в IE: не могу, говорит, скастить HTMLInputElement в HTMLInputElement (хвала динамической типизации, где сравнение типов может делать что угодно кроме того, что надо!).
Итого, если ориентироваться на Firefox, то рулит С++ и ASM.js, в Хроме рулит чистый JS (который фактически и получается из Haxe), а если нужно, чтобы был компактный код, который стабильно и шустро работает везде, то по-прежнему рулит Flash. Ну а если еще про айфоны всякие вспомнить, то... проще плюнуть и никогда больше к этому проклятому болоту, фронтэнду, не приближаться.
no subject
Date: 2014-11-14 05:54 pm (UTC)Т.к. o instanceof t == true.
Но по спеке ES5, typeof host-object может быть либо object, либо function, а хакся считает, что только function, и ложит болт на результат instanceof.
Если запатчить эту строку, выходит такая картина:
(Win 8.1 x64, Core i7-4770, в фоне запущено штук 5 виртуалок, впрочем, особой погоды однопоточному JS они не делают)
dart2js CR 64, FF 49, IE 64
asm2js: CR 60, FF 28, IE 95
haxe2js: CR 34, FF 32, IE 37
no subject
Date: 2014-11-14 06:12 pm (UTC)no subject
Date: 2014-11-14 06:26 pm (UTC)Сейчас погасил виртуалки, перебенчал, вышло 33 (хром), 29 (фф) и те же 37 (ие).
При этом asmjs быстрее не стал, что любопытно. Грешу на всякие эффекты от кэшей.