MrZhao_PerfectCode的博客

本博客均是详细讲解

android 多线程并发或分布式提高TPS

一、多线程并发或分布式提高TPS

        首先我们来说一下什么是TPS:TPS(Transaction Per Second)
        TPS为每秒处理的事务数,是系统吞吐量的指标,在搜索系统中也用QPS(Query Per Second)衡量。TPS一般与响应时间反相关。通常所说的性能问题就是指响应时间过长、系统吞吐量过低。


        1.多线程并发,防止线程阻塞带来的性能损失

       在实际的运行过程中,Android在调用接口时,会使用到很多IO接口,而IO很多是阻塞的,比如网络操作,为防止阻塞带来的性能损失,最好另起一个线程。

      Android系统其实已经注意到了这点,如果你在主线程做非常耗时的操作,UI线程5秒没有反应的话就会造成ANR,Android系统的这种限制,就要求开发者耗时操作必须另起一个线程,实际上就是一个提高性能,提升用户体验的一个设定。而且,前面提到的网络操作,Android系统本身就要求在子线程里面做网络操作,另外,Android 多方便开发者使用多线程,设计了很多多线程组件。

        2.多线程并发,提升运行速度。

       多线程的作用主要在于提高了并发数量,比如http请求,如果是单线程,一次只能接收一个请求,多线程则可以同时接收多个请求。单核的CPU多线程并不能提升速度,而多核CPU使用多线程将提升速度。线程池核心线程数的设置就是考虑到了这个特性。andro

            一般线程池核心线程数的设置:

                IO密集型= CPU核数 * 10 

                计算密集型 = CPU核数+1

        4.巧用线程池提高线程复用

前面提到了线程的多个生命周期,像Java的所有类一样,线程的创建和销毁也会影响到性能,销毁的时候大量的对象和内存需要回收,gc时势必会卡一下,如果有大量的线程要使用的话,最好使用线程池,它可以很好的管理线程,并提高线程重用度,降低线程的创建和销毁。

   5.设置线程的优先级,让紧急的任务尽快处理

方式一:Process.setThreadPriorityProcess.THREAD_PRIORITY_BACKGROUND); //设置线程优先级为后台,这样当多个线程并发后很多无关紧要的线程分配的CPU时间将会减少,有利于主线程的处理。

方式二:priority:【1, 10】,低优先级 -> 高优先级。



二、利用缓存提高TPS

缓存主要包括对象缓存、IO 缓存、网络缓存、图片缓存等 。

1.对象缓存

 gc执行的时候,系统是阻塞的,gc数据较大的时候,系统会很明显的卡顿。

 a.listview对象缓存

    listview快速滚动时,重复利用item,不必重新创建新的对象,也避免了对象的频繁销毁,减少了gc的数据的大小和时间。

 b.调用频繁的对象设为变成员量,或保存到容器中,避免频繁的创建和销毁。

 c.在方法体中,如果频繁使用某一成员变量,不妨新建一个局部变量对象引用,栈里面的局部变量调用肯定比堆要快一些

2.IO缓存

IO调用,比如文件读写,是比较耗费性能的,频繁的读写肯定是不行的,需要对读写操作做一下改进,比如设置buffer,等buffer满的时候再进行读写,可以有效的减少读写的次数。

3.网络缓存

a.比较流行的网络框架一般都有线程池,并且缓存网络调用,短时间内的多次网络调用,返回第一次调用的结果,用户对此没有感觉。

4.文件缓存

a.图片三级缓存

内存、SD卡、网络三级缓存,减少不必要的图片请求,从速度最快的内存中查找bitmap对象,如果没从sd卡中decode,实在不行再从网络拉数据流。

b.数据离线缓存

保存最后一次网络调用的数据到sd卡或者file,第一次进入APP时,可以先显示缓存的数据,然后在网络调用不是很忙碌时再请求。对于实时性要求不高、重要性低的数据可以采用这种策略。







    








       


阅读更多
上一篇android 详细讲解 高仿QQ弹出popwindow调用系统相机拍摄裁剪并预览设置图像
下一篇Java 让你彻彻底底明白JAVA堆与栈的区别
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭