iOS启动速度优化最佳实践

一、首先进行新工程代码速度评测,创建一个新工程启动发现速度很快到达页面,基本上不需要做任何底层优化即可达到启动速度优化的目的

二、然后在需要优化的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秒,可以说优化成果是非常显著的。

你可能感兴趣的:(iOS启动速度优化最佳实践)