簡體   English   中英

Emscripten將C ++編譯為JavaScript和Asm.js的結果很差

[英]Bad results with Emscripten compiling C++ to 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。 也許有人需要這個。

考慮到它必須包含相當於系統庫(libc等)的功能,因此10k行的javascript是相當適度的,當您執行c ++編譯的源代碼時,這些庫作為單獨的文件存在-當瀏覽器執行javascript的沙箱且無法訪問上的此類系統庫時例如,目標計算機(由於安全性,操作系統中立性等原因)只需對某些動態鏈接的c / c ++可執行文件執行ldd命令,即可了解這10,000行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/

從我的測試來看,Emscripten似乎只使用asm.js,並輸入"use asm"; 進入優化級別為-O1及更高級別的生成的Javascript。 因此,在編譯時,您需要將-O1 (或高於1級別)傳遞給編譯器:

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

如果您未指定優化級別,或通過-O0

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

然后"use asm"; 不會放入生成的Javascript中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM