美文网首页优化加速
iOS启动速度优化最佳实践

iOS启动速度优化最佳实践

作者: 王方帅 | 来源:发表于2019-10-25 15:58 被阅读0次

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

    二、然后在需要优化的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启动速度优化最佳实践

        本文链接:https://www.haomeiwen.com/subject/tljtvctx.html