APP的啟動可以分為2種
- 冷啟動(Cold Launch):從零開始啟動APP;
- 熱啟動(Warm Launch):APP已經(jīng)在內(nèi)存中,在后臺存活著,再次點(diǎn)擊圖標(biāo)啟動APP。
APP啟動時間的優(yōu)化,主要是針對冷啟動進(jìn)行優(yōu)化
- 通過添加環(huán)境變量可以打印出APP的啟動時間分析(Edit scheme -> Run -> Arguments)
DYLD_PRINT_STATISTICS設(shè)置為1;
- 如果需要更詳細(xì)的信息,那就將DYLD_PRINT_STATISTICS_DETAILS設(shè)置為1。
APP的冷啟動可以概括為3大階段
- dyld(dynamic link editor):
- Apple的動態(tài)鏈接器,可以用來裝載Mach-O文件(可執(zhí)行文件、動態(tài)庫等)
- runtime;
- main。
1. dyld 階段:
- 裝載APP的可執(zhí)行(Mach-o)文件,同時會遞歸加載所有依賴的動態(tài)庫;
- 當(dāng)dyld把可執(zhí)行文件、動態(tài)庫都裝載完畢后,會通知Runtime進(jìn)行下一步的處理。
2. runtime 階段:
- 調(diào)用
map_images進(jìn)行可執(zhí)行文件內(nèi)容的解析和處理:
_dyld_objc_notify_register(&map_images, load_images, unmap_image);
- 在
load_images中調(diào)用call_load_methods,調(diào)用所有Class和Category的+load方法;
// Call +load methods (without runtimeLock - re-entrant)
call_load_methods();
- 進(jìn)行各種objc結(jié)構(gòu)的初始化(注冊O(shè)bjc類 、初始化類對象等等)
- 調(diào)用C++靜態(tài)初始化器和
__attribute__((constructor))修飾的函數(shù)
- 到此為止,可執(zhí)行文件和動態(tài)庫中所有的符號(Class,Protocol,Selector,IMP,…)都已經(jīng)按格式成功加載到內(nèi)存中,被runtime 所管理。
3. main函數(shù)啟動階段
- 所有初始化工作結(jié)束后,dyld就會調(diào)用main函數(shù);
- 接下來就是UIApplicationMain函數(shù),AppDelegate的
application:didFinishLaunchingWithOptions:方法
冷啟動優(yōu)化:
1. dyld階段
- 減少動態(tài)庫、合并一些動態(tài)庫(定期清理不必要的動態(tài)庫);
- 減少Objc類、分類的數(shù)量、減少Selector數(shù)量(定期清理不必要的類、分類);
- 減少C++虛函數(shù)數(shù)量;(虛函數(shù)的存在,會生成一張?zhí)摫恚?/li>
- Swift盡量使用struct。
2. runtime階段
- 用+initialize方法和dispatch_once取代所有的
__attribute__((constructor))、C++靜態(tài)構(gòu)造器、ObjC的+load。
+ (void)initialize {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});
}
3. main
- 在不影響用戶體驗(yàn)的前提下,盡可能將一些操作延遲,不要全部都放在finishLaunching方法中;
- 按需加載。
iOS性能優(yōu)化:
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。