问题描述
我正在编写一个中等大小的 C++ 程序(大约 900 行;相当多的模板,惯用的 C++,只有 RAII 和集合,没有原始数组,没有指针,没有手动内存分配)。我的应用程序的本机构建大约需要 5 分钟,但问题始于 emscripten 构建。
Webassembly 发出的速度相对较快,只需几秒钟。在尝试优化 libstdc++ 运行时 (?) 的 acorn-optimizer 上构建停止。它已经运行了 20 分钟,我尝试重新运行并多次杀死它以使其构建我的应用程序。
我使用以下命令行:
em++ -std=c++20 -o tau.html lexer.cpp symtab.cpp parser.cpp decl.cpp tau.cpp -O3 -s WASM=1
em++
使用以下命令行启动进程:
/usr/bin/node /usr/share/emscripten/tools/acorn-optimizer.js /tmp/emscripten_temp_gwg74gkp/tau.js AJSDCE minifyWhitespace
它一直在使用我的处理器的一个内核和大约 50MB(波动)的 RAM,因此编译没有完成。
tau.js
内容如下:link。我设法(在某种程度上)找到了这个问题——一个 800 行的 C++ 项目对于 Emscripten 来说似乎太大了。 asm.js 输出在 -g3 -O0
构建(不运行压缩器的构建)上超过 6 兆字节
我对 Emscripten ABI 的低效和可怕感到惊讶。
我的问题如下 - 如何构建和优化此项目?每次我想编译一些东西时,我都必须在一夜之间离开构建吗?有没有更好的工具来编译 C++ 并针对 webasm 或 asm.js?
我放弃了 -O3
并决定尝试 -O1
,但没有成功 - 编译器崩溃:
em++ -std=c++20 -o tau.html lexer.cpp symtab.cpp parser.cpp decl.cpp tau.cpp -O1 -s WASM=0
Traceback (most recent call last):
File "/usr/share/emscripten/em++.py",line 14,in <module>
sys.exit(emcc.run(sys.argv))
File "/usr/share/emscripten/emcc.py",line 2156,in run
post_link(options,wasm_target,target)
File "/usr/share/emscripten/emcc.py",line 2320,in post_link
generate_html(target,options,js_target,target_basename,File "/usr/share/emscripten/emcc.py",line 3075,in generate_html
minify_html(target)
File "/usr/share/emscripten/emcc.py",line 3049,in minify_html
shared.check_call(['htmlmin',opts,'--',filename,filename])
File "/usr/share/emscripten/tools/shared.py",line 104,in check_call
return run_process(cmd,*args,**kw)
File "/usr/share/emscripten/tools/shared.py",line 94,in run_process
ret = subprocess.run(cmd,check=check,input=input,**kw)
File "/usr/lib/python3.9/subprocess.py",line 505,in run
with Popen(*popenargs,**kwargs) as process:
File "/usr/lib/python3.9/subprocess.py",line 951,in __init__
self._execute_child(args,executable,preexec_fn,close_fds,File "/usr/lib/python3.9/subprocess.py",line 1756,in _execute_child
self.pid = _posixsubprocess.fork_exec(
TypeError: expected str,bytes or os.pathLike object,not list
make: *** [Makefile:44: webasm] Error 1
emscripten for -g3 -O0 的 7 压缩输出如下:link。我不认为我的源代码在这里很重要 - 问题显然发生在 emscripten 运行时。
为了记录,我使用的是今年 1 月 24 日(即 2021 年)使用 emsdk 构建的 emscripten。
我选择 asm.js 还是 webasm 目标并不重要,因为阻碍编译的瓶颈是修改 emscripten 生成的样板 JS(如果 C++ 代码不是够了)。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)