编译器优化有几种
❶ 百度APP iOS端包体积50M优化实践(七)编译器优化
网络APP iOS端包体积优化系列文章深入探讨了包体积优化的整体方案、图片优化、资源优化、代码优化、无用类优化、HEIC图片优化实践以及无用方法清理。本篇将着重于编译器优化在网络APP实践中的应用。
编译器优化
编译器优化包括GCC语言编译优化、Swift编译优化、LTO优化、剥离调试符号、剥离符号表、剔除未引用的代码、Asset优化、C++虚函数优化和三方SDK编译器方向瘦身。
2.1 方案综述
2.2 GCC语言编译优化
2.2.1 综述
通过GCC编译优化,可以生成体积更小的二进制产物,对Objective C、C、C++均有效。
2.2.2 Objective C++编译优化
在XCode中编辑和编译Objective C++代码时,优化配置路径为:Build Settings -> Apple Clang -> Code Generation。可选参数包括:
默认优化等级为-Os,但我们使用-Oz优化方式。WWDC 2019《What's New in Clang and LLVM》详细解释了这种优化原理,它通过识别跨函数的相同代码序列减少代码大小。重复的连续机器指令被外联为函数,原始代码序列被替换为外联函数,虽然增加函数调用栈深度,但在当前高配置的iPhone设备上,这种性能损失是可以接受的。
实践表明,编译优化参数 -Oz对Objective C++代码有10%体积收益,对C和C++代码有30%收益。
2.2.3 C/C++编译优化
对于底层模块(如网络库、播放内核、视觉处理和端智能),常使用C和C++实现。这些模块支持跨平台,采用Cmake和GN编译。对于C++语言,cppFlags选项设置为'-Oz';对于C语言,cFlags选项设置为"-Oz"。
2.3 Swift编译优化
Swift优化包括Optimization Level和Compilation Mode,配置路径为:Build Settings -> Swift Compiler -> Code Generation。
Optimization Level可选参数值有:Optimize for Size,其核心原理与GCC语言编译优化类似,通过外联和复用重复的连续机器指令降低大小。Compliation Mode可选参数值有:Optimize for Size[-Osize]和Whole Mole,同时开启可减少10%的Swift包体积大小。
2.4 LTO优化
LTO是苹果官方提出的一种优化策略,通过在链接阶段进行跨模块优化,减少代码大小和提高执行效率。配置路径为:Build Settings -> Apple Clang -> Code Generation -> Link-Time Optimization,设置为Incremental。
LTO优化体现在:函数内联化、去除无用代码、全局优化。但负面影响包括:降低Link Map的可读性、增加编译和链接时间。
2.5 剥离调试符号
默认设置Symbols Hidden by Default为YES,可减少包大小。动态库设置为NO,否则会引发链接错误。
2.6 剥离符号表
配置路径为:Build Settings -> Strip Linked Proct。选择属性值为YES。
Strip Linked Proct用于去除不必要的符号信息,去除后只能使用dSYM文件进行符号化,因此需将"Debug Information Format"修改为"DWARF with dSYM file"。
2.7 剔除未引用的代码
配置路径为:Build Settings -> Dead Code Stripping。选择属性值为YES。
该优化主要在链接时剔除C、C++、Swift等静态语言的无用代码,但在处理Objective-C时无效,因其基于Runtime机制编译。
2.8 Asset优化
配置路径为:Build Settings -> Asset Catalog Compiler -> Optimization。选择Space以优化包大小,收益较小。
2.9 C++减少虚函数的使用
减少虚函数使用可减少虚函数表占用空间,最终减小程序包大小。
2.10 三方SDK编译器瘦身
需对每个框架进行优化配置和微调,确保库和依赖项也正确配置,以确保与编译器优化兼容。
网络APP内部集成了众多第三方SDK,需优化SDK以实现应用瘦身。
指令集架构优化
支持arm64和x86_64架构,通过优化指令集架构减小上传到AppStore的包体积。
3.2 指令集架构设置
使用lipo命令从旧的framework中拆分指定架构的二进制文件,合并后替换老的framework的mach-o文件。
3.3 去除无用架构
通过验证AbcArm64和AbcArmX86_64架构信息。
XCode升级优化
苹果Xcode版本持续优化,如Xcode 14,提供更强大的并行编译能力,显着提高构建速度,优化包体积。
Swift内置动态库优化
自2014年发布以来,Swift语言发展迅速,成为iOS开发的首选语言。优化Swift内置动态库,只需将APP支持的最低版本修改为12.2。
优化后,网络APP包体积减少30M+,提交AppStore后,有显着收益。
编译器优化在网络APP包体积优化中的ROI最高,但影响范围广泛。通过实践,成功减少了30M的包体积,实现了自身库的全部收益,同时优化了前15个三方SDK。
总结了网络APP的编译器优化方案,包括多种优化手段,后续将继续深入探讨其他优化方法。
❷ ARM C语言编程优化策略(KEIL平台)
ARM C语言在KEIL平台上的编程优化策略主要包括编译器选项、循环优化、内联函数、volatile关键字使用、纯净函数、数据对齐、C99特性、栈和寄存器管理、编译器特性以及链接器应用。以下是对这些内容的概述:
1. 编译器优化选项:KEIL提供了不同等级的优化设置,如最小优化便于调试,有限优化在保持一定调试信息的同时减少代码体积,高度优化可能影响代码执行流程,而最大程度优化则牺牲调试信息以换取更高的执行效率。循环展开、内联函数的使用和控制,以及volatile关键字的正确使用都是优化策略的关键部分。
2. C循环优化:循环条件和展开的处理对代码体积和执行速度有直接影响。使用-O3优化等级时,编译器会自动进行适度的循环展开。
3. 内联函数:内联函数是代码体积与性能之间的权衡。编译器会根据优化等级和函数特性决定是否内联,使用__inline等关键字可以影响这一过程。
4. volatile关键字:在优化等级较高时,volatile可以防止未定义行为,尤其是在中断、多线程和寄存器读取中,需确保正确使用。
5. 纯净函数和数据对齐:利用纯净函数和自然对齐的特性,可以优化代码执行效率,减少不必要的变量访问。
6. C99特性:支持更易用的循环和结构体赋值,但需注意动态数据的使用限制和栈管理。
7. 链接器应用:理解section访问和函数替换技术,如$Super$$和$Sub$$,有助于在链接阶段进行代码定制。
深入理解并灵活运用这些策略,可以有效提升在KEIL平台上的ARM C语言程序性能和效率。
❸ 应用编译优化三种模式
应用编译优化三种模式分别是:编译时间优化模式、执行时间优化模式和代码大小优化模式。
1、编译时间优化模式:关注编译速度的提升,以缩短应用程序高脊的编译时间为目标。在这种模式下,编译器会减少编译时间,会降低应用程序的执行效率。
2、执行时间优化模式:关注应用程序的执行效率,以提高应用程序的性能为目标。在这种模式下,编译器会优化应用程序的代码,以提高执行效率,会增加编译时间。
3、代码大小优化模式:关注应用程序的大小,以减小应兆培用程序的体积为目标。族念唯在这种模式下,编译器会减小应用程序的代码大小,以减小应用程序的体积,会降低应用程序的执行效率。