gpt4 book ai didi

c++ - 如何减小 WASM 二进制文件的大小?

转载 作者:行者123 更新时间:2023-12-05 04:19:44 24 4
gpt4 key购买 nike

我有一个用 C++ 编写的项目,要部署的平台的二进制大小限制为 256KB。

工具链是wasi-sdk-16.0 clang++,我们使用这个编译器将源代码编译成WASM格式的二进制文件。在此步骤中,我们使用以下 CXX_FLAGS 编译源代码。

-fstack-protector-strong -Os -D_FORTIFY_SOURCE=2 -fPIC -Wformat -Wformat-security -Wl,-z,relro,-z,now -Wno-psabi

然后我们剥离二进制文件

strip -s output_binary.wasm

经过以上步骤,这一步编译后的二进制大小为254KB。

然后我们使用WAMR中的wamrc来编译带有AOT运行时的WASM二进制文件,命令如下所示。

wamrc --enable-indirect-mode --disable-llvm-intrinsics -o output.aot output.wasm

输出二进制大小变为 428KB,远大于限制(256KB)。


在 google 之后,我使用 wasm-opt 来减小尺寸,

wasm-opt -Oz output.wasm -o output.wasm

大小变小了 4KB。 (几乎没用)


我试图确认我的代码对二进制大小有多大影响,所以我编写了简单的最小示例代码,仅调用标准 c++ 库,如下所示,

#include <vector>
#include <iostream>

int main() {
std::vector<int> vec = {1,2,3,4,5};
for (auto v: vec) {
std::cout << v << " ";
}
}

编译后的二进制大小已经变成了205KB。


我还尝试使用二进制大小分析器 (twiggy) 来跟踪二进制文件每个部分的大小,但该工具无法打开此二进制文件。


所以我想问一下

  1. 虽然只包含两个标准 C++ 头文件使二进制大小达到大小限制,但我如何用我真正使用的函数剥离 C++ 标准库(我不能使用剥离未使用的函数标志,因为我的项目是一个库提供给其他人),或者真的是 C++ 标准库影响了二进制大小?

  2. 是否有任何其他编译器标志,或剥离标志,或任何其他优化工具可以显着减少二进制大小?


编辑:

我通过将 iostreamfstream 替换为 cstdio 来解决这个问题。它将大小从 254KB 减少到 85KB,因为 iostream 中包含太多模板。

虽然指定编译器标志,例如 -Oz 也减少了一些大小,但主要因素是从模板生成了太多代码。因此,当存在二进制大小限制时,请勿使用 C++ 流 API(以及任何其他模板繁重的通用库)。 (C 库总是值得相信的。)

最佳答案

我在您的帖子中没有看到的一件事是 wabtwasm-strip。我对它不够熟悉,不知道它是否比简单的 strip 命令做得更多,但也许值得一试。您可以在 Debian 系统上使用 apt install wasm-strip 安装它。

从我在互联网上看到的几个微基准测试来看,C++ wasm 二进制文件的开销很大。对于完全不科学的幻灯片,您可以观看 this .

如果出于某种原因,您无法使用该语言生成更小的二进制文件,您也可以尝试在链接级别进行优化,如 busybox

关于c++ - 如何减小 WASM 二进制文件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74720960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com