减少 Wasm 文件大小(libc、优化、emscripten)

Reducing Wasm filesize (libc, optimization, emscripten)

所以,我用 Emscripten 做了很多实验。我注意到的是,正在使用的 musl-libc 非常庞大……就像 真的 巨大。一个简单的 "Hello, World!" 打印应用程序远远超过 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()

在我的实验中,"Hello world" 的 printf() 版本高达 13KB,而 puts() 版本只有 2KB。

你说“A simple "Hello, World!" printing app”,但从更广泛的角度来看实际上并非如此,因为 printf() 是迄今为止 C 标准库中最大的部分二进制大小。实际上,他们设法将其减少到 13KB 令我感到有些惊讶。这主要是因为 % 格式。 printf()不仅要处理%c%d%ld等简单格式,还要处理%4.2f、[=]等复杂格式22=]、%E%*d

除了 web 应用程序,这是嵌入式系统中的一个常见问题,您应该针对 stdlib 静态 link 并且可用的程序内存大小通常只有 10kb。 Just google "printf size in embedded system",你会很容易地看到很多人对 printf() 充满仇恨,并为减小它的大小付出了很多努力。

切换像 uClibc 和 dietlibc 这样的 stdlib 不会有太大帮助,因为它们仍然是 POSIX 系统的库,该系统实现了 printf() 的完整规范。您应该为裸机嵌入式系统寻找标准库,例如 newlib-nano,它实现了 printf() 规范的一个子集以减少二进制文件的大小。此外,我不认为为 Emscripten 切换 stdlib 几乎是不可能的工作,因为 Emscripten 在他们的用例中使用了被严重破解的 musl-libc 版本。