- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用 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
) 来跟踪二进制文件每个部分的大小,但该工具无法打开此二进制文件。
所以我想问一下
虽然只包含两个标准 C++ 头文件使二进制大小达到大小限制,但我如何用我真正使用的函数剥离 C++ 标准库(我不能使用剥离未使用的函数标志,因为我的项目是一个库提供给其他人),或者真的是 C++ 标准库影响了二进制大小?
是否有任何其他编译器标志,或剥离标志,或任何其他优化工具可以显着减少二进制大小?
编辑:
我通过将 iostream
和 fstream
替换为 cstdio
来解决这个问题。它将大小从 254KB 减少到 85KB,因为 iostream
中包含太多模板。
虽然指定编译器标志,例如 -Oz
也减少了一些大小,但主要因素是从模板生成了太多代码。因此,当存在二进制大小限制时,请勿使用 C++ 流 API(以及任何其他模板繁重的通用库)。 (C 库总是值得相信的。)
最佳答案
我在您的帖子中没有看到的一件事是 wabt的 wasm-strip
。我对它不够熟悉,不知道它是否比简单的 strip
命令做得更多,但也许值得一试。您可以在 Debian 系统上使用 apt install wasm-strip
安装它。
从我在互联网上看到的几个微基准测试来看,C++ wasm 二进制文件的开销很大。对于完全不科学的幻灯片,您可以观看 this .
如果出于某种原因,您无法使用该语言生成更小的二进制文件,您也可以尝试在链接级别进行优化,如 busybox
关于c++ - 如何减小 WASM 二进制文件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74720960/
将多个值从 WebAssembly 传递到 Javascript 可能比需要的更难。通常,我发现我必须: 设置 Javascript 和 WebAssembly 之间共享的内存。 执行 WASM 工作
我正在构建一个 Flutter 网络应用程序。一切正常,直到随机进行了热重启,然后我开始收到此错误。 wasm streaming compile failed: TypeError: Could n
我想使用 python-ext-wasm 将 Rust 程序/项目编译为 Wasm,以便在我的 Python 应用程序中使用.现有的教程假定它是针对网络的并建议 wasm-pack .有没有另一种在没
脚步:cargo generate --git https://github.com/rustwasm/wasm-pack-template项目名称:project-name // src/lib.r
我正在处理 Rust WASM tutorial for Conway's game of life . 文件中最简单的函数之一叫做 Universe.render (它用于呈现代表游戏状态的字符串)
我有一个 WASM 函数,我想在我的以 WASM 为目标的 near-sdk Rust 项目中使用。我如何在我的 Rust 代码中调用这个函数? 最佳答案 您的情况还不够详细,无法给出详细的答案。 (
我正在尝试使用 Emscripten 作为学习机会将完整的 C++ 程序编译为 Wasm。以下命令确实生成了完整有效且有效的 HTML+JS+Wasm: emcc main.cpp [...libra
我正在尝试创建一个带有 Wasm 数据库层的 NodeJS 应用程序。我使用 Rust、Diesel 作为数据库驱动程序,使用 wasm-pack 作为 WebAssembly 编译器。 当我尝试使用
我正在尝试关注 Rust WebAssembly book我被困在第 4.2 节的练习中。我按照答案中的描述更改了所有内容,但是给定的 &str (姓名)在greet函数始终为空。 这是我的 gree
我在构建项目(Angular 8)时遇到上述错误。我们如何修复这个错误? 最佳答案 $env:NODE_OPTIONS = "--no-experimental-fetch" 在 Power shel
br_if 是如何工作的。我已经阅读了文档,但我没有找到任何关于 br_if 的结果值的信息。我用 WebAssembly Studio .我有这段代码,但我不明白为什么会这样。 (func $f (
我想创建一个 .wasm编译时仍具有导出的函数名称的文件。 package main import ( "fmt" ) func main() { fmt.Println("Main"
我有一个带有版本 5 程序集的 Blazor WASM 项目,并尝试根据这篇文章激活调试:https://docs.microsoft.com/en-us/aspnet/core/blazor/deb
我正在使用 Blazor WASM 开发简单的在线游戏。最近我发现 Blazor 客户端是单线程的,这对于我的大多数算法来说都是灾难性的。我想实现比权威服务器更好的架构,并能够在客户端运行代码(用于滞
由于 Wasm 是以非人类可读的形式编写的,这是否使黑客几乎不可能查看站点的 Wasm 文件并弄清楚是什么? 我知道在客户端保留敏感数据从来都不是最佳实践,但在代码模糊性方面,Wasm 似乎有点改变游
当我们将一个c源文件编译成wasm时,会有很多import "env"xxxx段。比如这是我的c源文件, char message[] = "hello wasm!"; char* getMessag
我有一个用 C++ 编写的项目,要部署的平台的二进制大小限制为 256KB。 工具链是wasi-sdk-16.0 clang++,我们使用这个编译器将源代码编译成WASM格式的二进制文件。在此步骤中,
已关注 Dynamically set the culture from the Accept-Language header本地化我的 blazor wasm 应用程序。 WebUI.csproj
我正在使用 vscode。我无法调试“独立”(或“托管”)blazor wasm。 有很多这样的问题,但它们是针对 RC、显然已为 .NET 6 修复的错误,或显然已在 SDK 6.0.102 中修复
我是 Rust 的新手,到目前为止我对它的设计感到惊讶。但是我遇到了一些让我害怕在商业项目中使用它的事情。 “Hello world”应用程序的可执行二进制文件大小为 3.2Mb。 -rwxr-xr-
我是一名优秀的程序员,十分优秀!