SuperAPI AI 工具集

binary-size

部署与运维

查看项目

更新于 10-16 04:54

技能介绍

用途:分析并缩减 ExecuTorch 的二进制体积,适用于调查体积、运行体积测试或为资源受限部署优化运行时。

主要能力:构建并测量基线体积;用 bloaty 按符号或 ELF 段分析、对比两次构建差异;用 nm 查看符号大小;用 strings 查看 .rodata 中的字符串。构建脚本 test/build_size_test.sh 会产出两个二进制:cmake-out/test/size_test(不含算子实现的运行时)和 cmake-out/test/size_test_all_ops(含 portable ops 的运行时)。

使用方式:从 executorch 主分支开始,确认仓库位置后执行 git checkout main && git pull;执行 conda activate executorch 和 bash test/build_size_test.sh;再用 strip -o /tmp/size_test_stripped cmake-out/test/size_test 等命令剥离符号并测量。分析示例:bloaty cmake-out/test/size_test -d symbols -n 30、bloaty cmake-out/test/size_test -d sections、bloaty <after> -- <before>、nm -S <binary> | sort -k2 -rn | head -30、strings <binary> | less。注意 bloaty -d compileunits 需要调试信息(-g),Release 构建不含。

关键构建标志:CMAKE_BUILD_TYPE=Release;EXECUTORCH_OPTIMIZE_SIZE=ON(启用 -Os、-fno-exceptions、-fno-rtti、抑制 unwind 表);CXXFLAGS="-fno-exceptions -fno-rtti -Wall -Werror"。

约束:用 CMake 而非 Buck 构建;最低 C++17;须兼容 CI 使用的 GCC 9 与 Clang 12,避免无版本保护的编译器专有标志;不得回退已有功能,需为修改文件运行测试;不得为缩减体积而改动 build_size_test.sh 中的构建标志;不得增加核心运行时延迟。

优化方向:.text 中查找大函数、模板膨胀、重复实例化;.rodata 中冗长错误信息、格式字符串、内嵌路径(FILE);.eh_frame 在开启优化时应已抑制;静态初始化函数(nm -S <binary> | grep GLOBAL__sub_I)可用 constexpr 构造函数常量初始化静态数组;日志字符串方面 Release 下 ET_LOG_ENABLED=0 可消除格式字符串,需通过 cmake 目标的 PUBLIC 编译定义传播给使用者;注意库与使用者编译单元间编译定义不一致。

流程:为每项改动创建分支 git checkout -b binary-size-<N>,实现、重建并测量剥离后体积;每个逻辑改动单独提交 PR;在 binary-size-<N>.md 记录本改动与累计的前后体积;体积下降时更新 .github/workflows/pull.yml 中的 CI 体积阈值。