TPS(Transaction Per Second)
TPS为每秒处理的事务数,是系统吞吐量的指标,在搜索系统中也用QPS(Query Per Second)衡量。TPS一般与响应时间反相关。

通常所说的性能问题就是指响应时间过长、系统吞吐量过低。

Android高性能编码一:多线程并发或分布式提高TPS

Android高性能编码二:利用缓存提高TPS

Android高性能编码三:数据结构和算法优化

Android高性能编码四:代码优化

多线程优化TPS主要有以下几种方式

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

Android 高性能编码一:多线程并发或分布式提高TPS_第1张图片

Java线程存在创建、可运行、阻塞、运行中、死亡等生命周期,每个线程在运行的过程中,不可避免的要被阻塞,等待时机成熟再运行,这个时候CPU的资源不能浪费,就需要再起起一个线程去做其他事情,正如烧水的例子,你可以在等待水开的过程中,准备好茶具、茶叶,然后水开之后就可以泡茶,如果你单线程操作的话,等你准备好之后,水也凉了半截了,这就是一个多线程的例子,反正闲着也是闲着。多线程可以在比较短的时间里,做完一项复杂的工作。这个熟悉的例子是我们最开始学习多线程时就明白的道理。

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

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

可以参考文章http://www.cnblogs.com/bugly/p/5519510.html,作者详细的介绍了Android系统为了多线程设计的组件的使用场景。


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

在使用多线程时,一定要知道一个道理:处理速度的最终决定因素是CPU、内存等,在单CPU(无论多少核)上,分配CPU资源的单位是“进程”而不是“线程”。
我们可以做一个简单的试验:

假设我要拷贝100万条数据,单CPU电脑,用一个进程,在单线程的情况下,CPU占用率为5%,耗时1000秒。那么当在这个进程下,开辟10个线程同时去运行,是不是CPU占用率增加到50%,耗时减少到100秒呢?显然不是。我实测出来的情况是这样的:

“CPU占用率仍然是5%,总耗时仍然是1000秒。且每个线程的运行时间也为1000秒。”

重点是后面那句,怎么理解?意味着什么?
我的理解如下:进程只有一个,所以分配的CPU资源是一定的,多线程只不过是轮流抢占CPU而已,并不会真正提高处理速度。这意味着,多线程的作用主要在于提高了并发数量,比如http请求,如果是单线程,一次只能接收一个请求,多线程则可以同时接收多个请求。

所以,单核的CPU多线程并不能提升速度,而多核CPU使用多线程将提升速度。线程池核心线程数的设置就是考虑到了这个特性。

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

IO密集型 = CPU核数 * 10 

计算密集型 = CPU核数+1


3.多线程分布式,使业务逻辑清晰严谨

通过巧妙的结合使用synchronized和Thread的join、wait、notify、notifyAll等方法会使代码更严谨,高效。像录制视频的例子,为保证视频的质量,音频和视频的录制编码必须严谨,就是巧妙的使用了线程。


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

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


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

系统对线程的调度,按照线程的优先级,Android系统有两个API可以设置优先级

a.方式一

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //设置线程优先级为后台,这样当多个线程并发后很多无关紧要的线程分配的CPU时间将会减少,有利于主线程的处理,相关的Thread优先级 Android就Android平台专有的定义罗列有以下几种:

  int THREAD_PRIORITY_AUDIO //标准音乐播放使用的线程优先级  int THREAD_PRIORITY_BACKGROUND //标准后台程序  int THREAD_PRIORITY_DEFAULT // 默认应用的优先级  int THREAD_PRIORITY_DISPLAY //标准显示系统优先级,主要是改善UI的刷新  int THREAD_PRIORITY_FOREGROUND //标准前台线程优先级  int THREAD_PRIORITY_LESS_FAVORABLE //低于favorable  int THREAD_PRIORITY_LOWEST //有效的线程最低的优先级  int THREAD_PRIORITY_MORE_FAVORABLE //高于favorable  int THREAD_PRIORITY_URGENT_AUDIO //标准较重要音频播放优先级  int THREAD_PRIORITY_URGENT_DISPLAY //标准较重要显示优先级,对于输入事件同样适用.

    field public static final int THREAD_PRIORITY_AUDIO = -16; // 0xfffffff0    field public static final int THREAD_PRIORITY_BACKGROUND = 10; // 0xa    field public static final int THREAD_PRIORITY_DEFAULT = 0; // 0x0    field public static final int THREAD_PRIORITY_DISPLAY = -4; // 0xfffffffc    field public static final int THREAD_PRIORITY_FOREGROUND = -2; // 0xfffffffe    field public static final int THREAD_PRIORITY_LESS_FAVORABLE = 1; // 0x1    field public static final int THREAD_PRIORITY_LOWEST = 19; // 0x13    field public static final int THREAD_PRIORITY_MORE_FAVORABLE = -1; // 0xffffffff    field public static final int THREAD_PRIORITY_URGENT_AUDIO = -19; // 0xffffffed    field public static final int THREAD_PRIORITY_URGENT_DISPLAY = -8; // 0xfffffff8
数值越小优先级越低,

优先级越高的线程被优先处理

04-23 11:20:09.312 17761-17777/com.vrseen.test2 D/TestThreadPriority: Thread B os priority: -19 loop count: 9985904-23 11:20:09.312 17761-17776/com.vrseen.test2 D/TestThreadPriority: Thread A os priority: 19 loop count: 8970104-23 11:20:09.312 17761-17777/com.vrseen.test2 D/TestThreadPriority: Thread B os priority: -19 loop count: 9986004-23 11:20:09.312 17761-17776/com.vrseen.test2 D/TestThreadPriority: Thread A os priority: 19 loop count: 8970204-23 11:20:09.312 17761-17776/com.vrseen.test2 D/TestThreadPriority: Thread A os priority: 19 loop count: 8970304-23 11:20:09.312 17761-17777/com.vrseen.test2 D/TestThreadPriority: Thread B os priority: -19 loop count: 9986104-23 11:20:09.312 17761-17776/com.vrseen.test2 D/TestThreadPriority: Thread A os priority: 19 loop count: 89704

线程B优先级-19比低优先级19的线程A执行多了将近10万的loop,多执行了10万多次。


b.方式二

java.lang.Thread.setPriority (int priority)
priority:【1, 10】,低优先级 -> 高优先级。

   /**     * The minimum priority that a thread can have.     */    public final static int MIN_PRIORITY = 1;   /**     * The default priority that is assigned to a thread.     */    public final static int NORM_PRIORITY = 5;    /**     * The maximum priority that a thread can have.     */    public final static int MAX_PRIORITY = 10;


-23 11:15:27.804 13432-13448/com.vrseen.test2 D/TestThreadPriority: Thread B java priority: 1 loop count: 7521204-23 11:15:27.804 13432-13448/com.vrseen.test2 D/TestThreadPriority: Thread B java priority: 1 loop count: 7521304-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9986004-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9986104-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9986204-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9986304-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9986404-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9986504-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9986604-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9986704-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9986804-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9986904-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9987004-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9987104-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9987204-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9987304-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9987404-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9987504-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 9987604-23 11:15:27.804 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 99877......04-23 11:15:27.805 13432-13447/com.vrseen.test2 D/TestThreadPriority: Thread A java priority: 10 loop count: 100000

线程优先级数值为10的比数值为1的线程多执行25万次

方式二效果更好。


demo参考文章

http://blog.sina.com.cn/s/blog_601cbd070100njbi.html


更多相关文章

  1. Android编译系统(一、环境与命令)
  2. Android 系统用户态启动过程
  3. 初入Android~系统化学习必备(转自http://bbs.weand.com/read-htm-
  4. mac上AndroidStudio自带的SDK manager 系统菜单显示问题
  5. Android Asynchronous Http Client - 开源http 多线程引擎
  6. Android输入系统
  7. Android系统的内存管理研究
  8. Android系统架构概述
  9. Android系统各个版本 最新市场份额变换

随机推荐

  1. typedef在c语言中是什么意思
  2. c语言换行符号是什么
  3. c语言中\t是什么意思
  4. 史上最佳的C#编程书籍推荐
  5. &&在C语言中是什么意思
  6. c++标识符命名规则
  7. c语言中将一个字符串转换到整型数据类型
  8. c语言整除符号是什么?
  9. c语言\n什么意思?
  10. C语言中数据int的取值范围为多少?