Плохие результаты при компиляции Emscripten C ++ в JavaScript & amp; asm.js

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

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

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


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

1

Решение

Из моего тестирования 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.

1

Другие решения

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

ldd /bin/lslinux-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/

1