【问题标题】:Reducing Wasm filesize (libc, optimization, emscripten)减少 Wasm 文件大小(libc、优化、emscripten)
【发布时间】:2019-02-19 08:33:01
【问题描述】:

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

【问题讨论】:

  • 您也可以尝试使用 -Oz,但 Emscripten 可能不是针对嵌入式系统的好工具集。它是目前针对 Web 浏览器的工具集。

标签: c++ optimization emscripten webassembly


【解决方案1】:

简单回答:如果您关心二进制大小,请不要使用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() 感到厌恶,并努力减少它的大小。

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

【讨论】:

  • 另一个类似的解决方案是真正的 C++;使用std::cout。它也不进行运行时格式化,这意味着您只需要那些您实际使用的operator<< 重载,并且选择它们的逻辑已经在编译器中运行。
  • @MSalters 这很有趣。我是一名 C 嵌入式系统开发人员,最近玩了 Emscripten。我对 C++ IO 了解不多。我会在短暂学习后补充一下std::cout
  • @MSalters 好吧,我试过std::cout << "Hello World",但二进制大小是惊人的 150KB,所以它不能成为 Emscripten 的解决方案。我认为iostream 需要很大的运行时间。
  • 感谢@BumsikKim 和@MSalters!我不得不承认,我完全没有考虑过printf 具有的格式化功能——它最终会变得如此之大也就不足为奇了。我将尝试std::cout,看看会发生什么。此外 - 它可能不进行格式化,但由于运算符重载,一些值类型仍然可以很容易地打印出来,无论是更少的格式化......这无论如何都不是我想要做的。非常感谢!
  • @BumsikKim 我可以确认:192kb 与 coutendlstring。哎哟!即使在它上面运行wasm-gc 也对减小该大小没有任何好处。嗯……这样,STL 的这个特定部分就完全无法选择了。所有这些运算符重载可能都没有被剥离......我希望有 nm 用于读取 WASM 文件中的符号。 x) 还是谢谢你!
猜你喜欢
  • 1970-01-01
  • 2021-11-27
  • 2023-01-02
  • 2020-04-23
  • 2021-09-01
  • 2018-04-27
  • 2013-06-25
  • 2011-01-10
  • 1970-01-01
相关资源
最近更新 更多