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

问题描述 投票:0回答:1

所以,我用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");

c++ optimization emscripten webassembly
1个回答
2
投票

Simple answer: If you care about the binary size, never use 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。

© www.soinside.com 2019 - 2024. All rights reserved.