一线大厂资深APP性能优化系列(二)异步优化与拓扑排序,kotlin枚举类型判断

本文介绍了如何对APP进行启动优化,包括使用FixedThreadPool进行线程池改造,通过CountDownLatch解决依赖问题,以及利用拓扑排序创建启动器来高效管理任务执行顺序。通过这些方法,实现了启动速度的显著提升。
摘要由CSDN通过智能技术生成

启动优化是一个大型软件开发中要做的第一步优化,因为无论你的APP做的内容有多么丰富,如果启动比较慢的话,那么给用户的第一印象就会非常不好。

想到异步首先想到的就是开线程,但是需要注意的是不要直接就去开线程,因为线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom,所以我们使用线程池的方式去执行异步。

对线程池不了解的就去看 大话线程池原理

3.第一次改造(FixedThreadPool)

这里我们采用 FixedThreadPool 来解决卡顿。但是问题来了, 这个线程池需要指定多少个线程合适尼?

有人会说,有几个方法就指定几个呗。。(突然想吐槽下,阿里里面曾经有个项目,就是这么做的,开的线程池就是按心情随便指定了个数字。。。其实是不对的,但咱人小势微的也不敢说啊)

为了更高效的利用CPU,尽量线程池数量不要写死,因为不同的手机厂商的CPU核数也是不一样的,设置的线程数过小的话,有的CPU是浪费的,设置过多的话,均抢占CUP,也会增加负担。所以正确的写法是:

// 获得当前CPU的核心数
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();

// 设置线程池的核心线程数2-4之间,但是取决于CPU核数
private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));

// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(CORE_POOL_SIZE);
复制代码

实验证明,根据这个公式来算出的线程数是最合理的,至于为什么是这样算,不是全占用了CPU数是最好的吗?

表示不信作者的同学你就自己看下面的公式,欢迎来怼作者!

好了我们用线程池改造下

@Override
public void onCreate() {
super.onCreate();

// Debug.startMethodTracing(“MyApplication”);
ExecutorService executorService = Executors.newFixedThreadPool(CORE_POOL_SIZE);

executorService.submit(new Runnable() {

@Override
public void run() {

initBugly();
}
});

executorService.submit(new Runnable() {

@Override
public void run() {

initBaiduMap();
}
});

executorService.submit(new Runnable() {

@Override
public void run() {

initJPushInterface();
}
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值