所以,我用Emscripten做了很多实验。我注意到的是,正在使用的musl-libc非常庞大......就像,真的很大。简单的“Hello,World!”打印应用程序超过10kb ...这是迄今为止不实用的。
现在我该如何减少这个?到目前为止,我认为我可以使用-Os
和--closure 1
。但后者只适用于JavaScript,所以它不会影响Wasm输出。
我还可以做些什么?可能使用不同的libc实现?我看了uClibc和dietlibc以及Metallic。我还考虑过一个廉价的文件大小的deflate函数,所以我可以转移一个gzip版本的Wasm二进制文件。但到目前为止,这就是我所得到的。
有什么建议?我的最后一次尝试是:
emcc test.cpp -o test.wasm -s WASM=1 -Os --closure 1
其中test.cpp
只是一个printf("Hello, world");
。
printf()
, consider using 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()的讨厌和很多努力减少它的大小。
像uClibc和dietlibc这样切换stdlib也无济于事,因为它们仍然是POSIX系统的库,它实现了printf()的完整规范。您应该为裸机嵌入式系统寻找stdlibs,例如newlib-nano,它实现了printf()规范的子集以减少二进制大小。此外,我不认为为Emscripten切换stdlib几乎是一项不可能的工作,因为Emscripten在其用例中使用了大量黑客版本的musl-libc。