使用 emscripten 构建项目 - 坚持使用 acorn-optimizer

问题描述

我正在编写一个中等大小的 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,因此编译没有完成。

enter image description here

tau.js 内容如下:link。我设法(在某种程度上)找到了这个问题——一个 800 行的 C++ 项目对于 Emscripten 来说似乎太大了。 asm.js 输出-g3 -O0 构建(不运行压缩器的构建)上超过 6 兆字节

enter image description here

我对 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

我也试过 -g3 -O0,但输出代码不起作用:

enter image description here

emscripten for -g3 -O0 的 7 压缩输出如下:link。我不认为我的源代码在这里很重要 - 问题显然发生在 emscripten 运行时。

为了记录,我使用的是今年 1 月 24 日(即 2021 年)使用 emsdk 构建的 emscripten。

我选择 asm.js 还是 webasm 目标并不重要,因为阻碍编译的瓶颈是修改 emscripten 生成的样板 JS(如果 C++ 代码不是够了)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...