Плохие результаты с компиляцией Emscripten C++ в JavaScript и Asm.js

Для курса в университете мне нужно продемонстрировать asm.js. Я нашел учебник (http://www.sitepoint.com/understanding-asm-js/), что было именно то, что я искал. Поэтому я создал данный C++-файл и скомпилировал его с помощью Emscripten. В результате получился файл длиной почти в 10000 строк. Нигде не найти выражение «использовать asm». И по сравнению с рукописным JavaScript-файлом он намного медленнее.

Я использую переносной пакет Emscripten-SDK и обновил его перед использованием.

Как заставить Emscripten генерировать хороший asm-код?


ОБНОВЛЕНИЕ: я нашел другое решение для своей демонстрации без Emscipten: https://gist.github.com/dherman/3d0b4733303eaf4bae5e. Может кому это надо.


person Thomas Körner    schedule 05.12.2014    source источник
comment
Хотя я не нашел способа заставить Emscripten установить оператор use asm (я изменил его вручную), я соглашаюсь с @scott-stensland, что выводимый код должен быть таким, какой он есть, но проблема была настолько проста, этот простой js просто быстрее, чем код из 10 тысяч строк. Но я так и не понял, почему Emscripten не использует asm в коде.   -  person Thomas Körner    schedule 17.12.2014


Ответы (2)


Из моего тестирования кажется, что Emscripten использует только asm.js и помещает "use asm"; в сгенерированный Javascript на уровнях оптимизации -O1 и выше. Поэтому при компиляции вам нужно передать компилятору -O1 (или более высокий уровень, чем 1):

eemcc source.cpp -O1 -o target.js`

Если вы не укажете уровень оптимизации или передадите -O0:

eemcc source.cpp -O0 -o target.js`

тогда "use asm"; не помещается в сгенерированный Javascript.

person Michal Charemza    schedule 28.03.2015

10 тыс. строк javascript — это довольно скромно, учитывая, что он должен включать функциональный эквивалент системным библиотекам (libc и т. д.), которые живут как отдельные файлы при выполнении исходного кода, скомпилированного на С++ — когда браузеры выполняют javascript, он помещается в песочницу и не может получить доступ к таким системным библиотекам на целевой компьютер (из-за безопасности, нейтральности ОС...), например, просто выполните команду ldd для некоторого динамически связанного исполняемого файла c/c++, чтобы получить представление о том, что заменяет основная часть этих 10 тыс. строк javascript:

ldd /bin/ls 


linux-vdso.so.1 =>  (0x00007fff8c865000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f7b82854000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f7b8264b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7b82285000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f7b82018000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7b81e14000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7b82aba000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f7b81c0e000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7b819f0000)

это может дать вам больше советов по использованию asm.js и emscripten: https://hacks.mozilla.org/2014/11/porting-to-emscripten/

person Scott Stensland    schedule 05.12.2014