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

标签 c++ optimization emscripten webassembly

所以,我用 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/

相关文章:

c++ - c++11 中的 typeid(T).name() 替代方案?

c++ - 不同编译器上 double 的不同行为

c++ - 不同类型的Typedef重定义(Emscripten SDL2+OpenGL)

c - 如何将 char* 参数传递给在 Node.js 中执行的 C 方法?

c++ - 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?

c++ - 选择性地禁用隐式对象复制

c++ - 为什么 GCC 不能优化 `std::sqrt` ?

algorithm - 有效地找到二维网格中最大的周围正方形

django - 如何使用 ToManyField 加快 Tastypie 的查询速度

firefox - 如何从 C 代码生成带有 i64 而不是 i32 的 Webassembly (WAT)