編譯器優化有幾種
❶ 百度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、代碼大小優化模式:關注應用程序的大小,以減小應兆培用程序的體積為目標。族念唯在這種模式下,編譯器會減小應用程序的代碼大小,以減小應用程序的體積,會降低應用程序的執行效率。