2014-12-05 58 views
1

對於在大學開設的課程,我必須演示asm.js.我找到了一個教程(http://www.sitepoint.com/understanding-asm-js/),這正是我所期待的。 所以我創建了給定的C++ - 文件並用Emscripten編譯它。 結果是一個接近10000行的文件。無處可尋找「使用asm」語句。與手寫JavaScript文件相比,它要慢得多。使用Emscripten將C++編譯爲JavaScript和Asm.js的結果不好

我正在使用便攜式Emscripten-SDK包,並在使用它之前對其進行了更新。

我怎樣才能讓Emscripten生成良好的asm-Code?


更新: 我發現我的演示不同的解決方案,而Emscipten: https://gist.github.com/dherman/3d0b4733303eaf4bae5e。 也許有人需要這個。

+0

儘管我沒有找到讓Emscripten設置「use asm」語句的方法(我用手改了它),但是我跟@ scott-stensland一起輸出的代碼必須是這樣,但是問題是如此簡單,普通的js比10k行代碼更快。但我沒有發現,爲什麼Emscripten不會在代碼中使用「asm」。 – 2014-12-17 08:32:32

回答

1

考慮到它必須包含與系統庫(libc等等)相當的功能,當您執行C++編譯源文件時,它們將作爲獨立文件生存 - 當瀏覽器在其沙箱中執行javascript並且無法訪問時目標計算機上的這樣的系統庫(由於安全性,操作系統的中立性...),例如,只需對某些動態鏈接的c/C++可執行文件執行ldd命令即可瞭解這些10k行的大部分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/

1

從我的測試中,Emscripten似乎只使用asm.js,並將"use asm";放入生成的Javascript中,優化級別爲-O1及以上。所以,編譯時你需要傳遞-O1(或大於1一個更高的水平)編譯器:

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

如果不specifiy優化級別,或通過-O0

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

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

相關問題