一、首先进行新工程代码速度评测,创建一个新工程启动发现速度很快到达页面,基本上不需要做任何底层优化即可达到启动速度优化的目的
二、然后在需要优化的APP中didFinishLaunching方法最后加一段代码测试:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSMutableArray *a = [NSArray array];
[a addObject:@"1"];
});
发现在闪退前页面已经成功加载出来了,说明didFinishLaunching方法优化完即可达到优化目的
三、在didFinishLaunching中通过CFAbsoluteTimeGetCurrent()来计算每行代码的耗时。然后把所有耗时打印出来,选择其中耗时最大的代码进行优化。
//通用API
#ifdef DEBUG
#define kComputeCodeTime(timeName) NSNumber *timeName = @(CFAbsoluteTimeGetCurrent());
#define kGetTimeLogStr(result,array) NSString *result = [[NSMutableString alloc] initWithString:@""];\
for (int i = 1; i < array.count-1; i++){\
NSNumber *preNum = array[i-1];\
NSNumber *num = array[i];\
[(NSMutableString *)result appendFormat:@"%.3f\t", num.doubleValue-preNum.doubleValue];\
}\
NSNumber *startNum = [array firstObject];\
NSNumber *stopNum = [array lastObject];\
[(NSMutableString *)result appendFormat:@"%.3f\t", stopNum.doubleValue-startNum.doubleValue];\
result = [result copy];
#else
#define kComputeCodeTime(timeName)
#define kGetTimeLogStr(result,array)
#endif
//didFinishedLaunching
kComputeCodeTime(startTime)
kComputeCodeTime(q1Time)
kComputeCodeTime(q2Time)
kComputeCodeTime(stopTime)
#ifdef DEBUG
NSArray *array = @[startTime,q1Time,q2Time,stopTime];
kGetTimeLogStr(result,array)
NSLog(@"didFinishLaunchingWithOptions:%@",result);
#endif
四、发现一个现象,每次启动速度都不一样,发现APP中有一个同步请求,请求配置数据回来后再初始化APP,这就是最大的需要优化的地方了
将同步请求改成异步请求后,成功将此请求时间从0.093秒到2.084恢复到了0秒
AppConfigModel *model = [AppConfigModel sharedInstance];
model.secondsToTimeout = 3;
[model requestSynWithGet];
改为
dispatch_async(dispatch_get_global_queue(0, 0), ^{
AppConfigModel *model = [AppConfigModel sharedInstance];
model.secondsToTimeout = 3;
[model requestWithGet];
});
五、将一个0.25秒到0.68秒的进行定位跟踪,把友盟注册改为子线程初始化,成功降到0.026-0.037秒
UMSocialManager *manager = [UMSocialManager defaultManager];
[manager setUmSocialAppkey:UMENG_APP_KEY];
[manager setPlaform:UMSocialPlatformType_WechatSession appKey:WECHAT_APP_KEY appSecret:WECHAT_SECRET_KEY redirectURL:@"http://wx.gu360.com/"];
[manager setPlaform:UMSocialPlatformType_Sina appKey:WEIBO_APP_KEY appSecret:WEIBO_APP_SECRET redirectURL:WEIBO_APP_REDIRECT_URL];
改为
UMSocialManager *manager = [UMSocialManager defaultManager];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[manager setUmSocialAppkey:UMENG_APP_KEY];
[manager setPlaform:UMSocialPlatformType_WechatSession appKey:WECHAT_APP_KEY appSecret:WECHAT_SECRET_KEY redirectURL:@"http://wx.gu360.com/"];
[manager setPlaform:UMSocialPlatformType_Sina appKey:WEIBO_APP_KEY appSecret:WEIBO_APP_SECRET redirectURL:WEIBO_APP_REDIRECT_URL];
});
五、其次是tabbar创建花费时间最长,后来再调试时不知为何,时间从0.889-1.106秒降到了0.117-0.198秒,后来想了一下难道是升级iOS13后降低了?后边在拿低版本手机试一下。
六、代码时间评测发现下面方法需要0.04秒到0.11秒的时间,为了不影响启动速度,将其延迟1秒执行,(因为不是启动后立马用的,所以延迟也没关系)
[SRWebViewUserAgent updateWebViewUserAgent];
改为
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[SRWebViewUserAgent updateWebViewUserAgent];
});
小结:还有其他细小的修改,大的思想就是同步改异步、可以放子线程初始化的放子线程、不是启动必须的最小所需代码则可以延后执行,成功从1.4-3.4秒降到了0.24-0.3秒,可以说优化成果是非常显著的。