所以,我用 Emscripten 做了很多实验。我几乎注意到的是,正在使用的 musl-libc 非常庞大……就像,真的 巨大。一个简单的“你好,世界!”打印应用程序远远超过 10kb...这目前还不实用。
现在我该如何减少呢?到目前为止,我认为我可以使用 -Os
和 --closure 1
。但后者仅适用于 JavaScript,因此它不会影响 Wasm 输出。
我还能做什么?也许使用不同的 libc 实现?我查看了 uClibc 和 dietlibc 以及 Metallic。我还考虑过寻找一个便宜的 - 文件大小方面的 - deflate 函数,这样我就可以传输 Wasm 二进制文件的 gzip 版本。但到目前为止,这就是我所得到的。
有什么建议吗?我最后一次尝试是:
emcc test.cpp -o test.wasm -s WASM=1 -Os --closure 1
其中 test.cpp
只是一个 printf("Hello, world");
。
最佳答案
简单的回答:如果你关心二进制大小,永远不要使用printf()
,考虑使用puts()
。
在我的实验中,printf()
版本的“Hello world”高达 13KB,而 puts()
版本只有 2KB。
你说“A simple "Hello, World!"printing app
”,但从更广泛的角度来看实际上并非如此,因为 printf()
是到目前为止,就二进制大小而言,C 标准库的最大部分。实际上,他们设法将其减少到 13KB 令我感到有些惊讶。这主要是因为 %
格式。 printf()
不仅处理%c
、%d
和%ld
等简单格式,而且它必须处理复杂的格式,例如 %4.2f
、%+.0e
、%E
和 %*d
。
除了 web 应用程序,这是嵌入式系统中的一个常见问题,您应该静态链接到 stdlib,可用的程序内存大小通常只有 10kb。 Just google "printf size in embedded system" ,您会很容易地看到很多人对 printf() 充满仇恨,并付出了很多努力来减小它的大小。
切换 stdlib 像 uClibc 和 dietlibc 不会有太大帮助,因为它们仍然是 POSIX 系统的库,它实现了 printf() 的完整规范。您应该为裸机嵌入式系统寻找标准库,例如 newlib-nano,它实现了 printf() 规范的一个子集以减少二进制文件的大小。此外,我不认为为 Emscripten 切换 stdlib 几乎是不可能完成的工作,因为 Emscripten 在他们的用例中使用了被严重破解的 musl-libc 版本。
关于c++ - 减少 Wasm 文件大小(libc、优化、emscripten),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54739158/