Emscripten 编译C++ 到 JavaScript 和 Asm.js 的结果很糟糕

Bad results with Emscripten compiling C++ to JavaScript & Asm.js

本文关键字:结果 js Asm C++ 编译 JavaScript Emscripten      更新时间:2023-09-26

对于大学的课程,我必须证明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。也许有人需要这个。

根据我的测试,Emscripten 似乎只使用 asm.js,并在优化级别 -O1 及以上"use asm";放入生成的 Javascript 中。所以在编译时,你需要传递-O1(或比1更高的级别)给编译器:

EEMCC来源.cpp-O1 -o 目标.js'

如果您没有指定优化级别,或者没有通过-O0

EEMCC来源.cpp -O0 -o 目标.js'

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

> 10k 行 JavaScript 是相当适中的,因为它必须包含与系统库(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/