
在鸿蒙NDK开发中,编译器对应用性能至关重要。毕昇编译器是基于LLVM开发的native编译器,能将C/C++代码编译链接成可在设备上运行的二进制,相比主流开源LLVM或GCC编译器,能提供更强大的优化能力。
一、毕昇编译器
毕昇编译器是基于LLVM开源软件开发的一款用于C/C++等语言的native编译器,能将C/C++代码工程编译链接成可以在设备上运行的二进制。
核心优势:在无需改动用户代码的条件下,相比业界主流的开源LLVM或GCC编译器,毕昇编译器能提供更强大的优化能力,使编译链接出来的二进制的运行时长更短、指令数更少,帮助提升应用在设备上的运行流畅度。
| 能力 | 说明 |
|---|---|
| 编译能力 | 将C/C++源码文件编译成汇编文件 |
| 汇编能力 | 将汇编文件汇编成可重定向文件(ELF格式二进制) |
| 链接能力 | 将一个或多个可重定向文件链接成可执行的二进制文件 |
二、亮点特征
2.1 Loop Distribution优化增强
毕昇编译器在场景识别、结构变换等方面做了改进和增强。相比开源LLVM编译器,能额外识别出循环内不同代码块间数据依赖关系以及不同代码块运行的迭代次数差别,从而对更多的循环进行loop distribution优化。
2.2 矢量化优化增强
毕昇编译器在矢量化优化方面,不仅能将更多的循环做矢量化转换,还在矢量化指令选择上更高效。例如开源LLVM编译器使用了5条矢量指令,而毕昇编译器只需要使用2条矢量指令,产生的二进制效率更优。
三、使用
3.1 在DevEco Studio中使用
| DevEco Studio版本 | 使用方式 |
|---|---|
| 5.1.1 release及之后 | 新建C/C++工程默认使用毕昇编译器;打开老工程有弹窗提示,点击Try Now可切换 |
| 5.1.1 beta及之前 | 默认使用开源llvm编译器,需在build-profile.json5中配置 |
配置方法(5.1.1 beta及之前):
在工程级build-profile.json5中设置nativeCompiler为BiSheng:
{
"runtimeOS": "HarmonyOS",
"nativeCompiler": "BiSheng"
}
3.2 在流水线中使用
步骤1:找到毕昇编译器路径
毕昇编译器所在路径:
xxx/sdk/default/hms/native/BiSheng
步骤2:替换编译器
方式一:命令替换
如果脚本中有指定使用的编译器路径,直接替换:
原路径:xxx/sdk/default/openharmony/native/llvm/bin/clang
新路径:xxx/sdk/default/hms/native/BiSheng/bin/clang
注意:确保sysroot路径仍指向HarmonyOS下的sysroot。
方式二:目录替换
-
将
xxx/sdk/default/openharmony/native下的llvm重命名为llvm-bak -
拷贝
xxx/sdk/default/hms/native/BiSheng到xxx/sdk/default/openharmony/native目录下 -
将
BiSheng重命名为llvm
常见问题:切换时遇到“找不到头文件”错误,添加--sysroot路径选项即可:
--sysroot=xxx/sdk/default/openharmony/native/sysroot
四、编译优化特性
4.1 IClang(增量编译优化)
IClang是一种增量编译优化手段,在增量编译基础上,实现函数级别的编译复用,利用上一次的编译结果,显著提升编译速度。
启用方式:编译时增加-iclang选项
add_compile_options(-iclang)
三种编译模式:
| 模式 | 说明 |
|---|---|
| 初始模式 | 首次编译,仅维护轻量元数据 |
| 预热模式 | 首次修改文件重新编译时,执行分析与缓存构建 |
| 增量编译模式 | 预热完成后,后续修改的增量编译得到加速 |
缓存失效情况:
-
上次编译生成的二进制产物被删除
-
头文件内容或配置发生变化
-
编译命令发生变化
编译选项限制:
-
仅作用于
-c编译,且只有一个输入文件和一个输出文件 -
仅支持
-O0优化级别(仅debug模式使用) -
不支持
-flto选项共同使用
4.2 PGO(Profile Guided Optimization)
PGO是一种自适应优化手段,通过收集代码在实际运行过程中的性能数据,指导编译器做出相应优化。
优化流程:
插桩阶段 → 采集阶段 → 优化阶段
1. 插桩阶段:
# 编译时增加选项
-fprofile-generate=/data/storage/el2/base/files
2. 采集阶段:
使用lldb方式进行profile数据采集:
# 在lldb中屏蔽信号量暂停效果
(lldb) process handle SIG* -s false
# 发送信号量触发数据写入
(lldb) process signal SIGUSR2
采集到的数据文件位于/data/app/el2/100/base/应用进程名/files目录下,生成default_*.profraw文件。
3. 优化阶段:
# 合并profraw文件
llvm-profdata merge --output=lib.profdata default_*.profraw
# 重新编译,使用profile数据
-fprofile-use=lib.profdata
4.3 LTO(Link Time Optimization)
LTO是一种在链接阶段跨编译单元进行优化的编译器优化手段。
启用方式:
add_compile_options(-flto)
注意事项:
| 选项 | 说明 |
|---|---|
-flto | 默认为full模式,性能更优但编译时长显著增加 |
-flto=thin | thin LTO模式,降低编译时长,性能略逊于full |
-flto-jobs=xxx | 指定并行任务数加速构建 |
4.4 fp优化
fp优化是一组控制浮点运算语义和行为的编译器选项,用于控制浮点表达式中的运算顺序是否可以被重排或合并。
启用方式:
add_compile_options(-ffp-contract=on)
说明:毕昇编译器默认关闭该优化。如果浮点计算场景较多,可以打开该优化。
鸿蒙毕昇编译器基于LLVM开发,提供比开源LLVM更强的优化能力(Loop Distribution、矢量化等),在DevEco Studio 5.1.1+默认使用,并支持IClang(增量编译复用)、PGO(运行时性能引导优化)、LTO(链接时跨单元优化)、fp优化等高级特性,帮助提升应用运行流畅度。

1630

被折叠的 条评论
为什么被折叠?



