浅谈APP端多线程性能

引言

多线程,或者说异步的概念,是在 Web 2.0 中火起来,因为在浏览器中 JavaScript 在单线程上执行,和 UI 渲染共用一个线程。这就意味着 JavaScript 在执行的时候 UI渲染和响应是处于停滞状态,如果 JavaScript 执行时间超过100毫秒,用户就会感到页面卡顿,以为网页停止响应。而异步线程,将脚本执行和 UI渲染在不同线程中执行,互不影响,从而很好的保证的用户体验。基于这个,这之后的有用户交互界面的语言,在设计上都有异步 I/O 的设计,像 iOS、Androd、nodeJS、winPhone、cocos2d、Unity3D 等 ,都融入多线程的概念。

原理

  • 单核CPU,同一时间内,只能处理1条线程,只有1条线程在工作;多线程并发执行,其实是CPU快速地在多条线程之间调度。如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象。
  • 多核CPU,同一时间内,每个核可以处理1条线程 , 这才是真正的多线程并发执行,但多核CPU因为优化上会困难很多。这也是为什么苹果一直对单核CPU性能优化,而不是盲目的增加多核的原因之一,后面稍微提下为什么苹果手机 CPU 现在最多还只有4核。

APP端多线程

现在的 APP 运行,都有一个主线程,也就是 UI 线程 ,这个线程优先级是最高的,CPU会优先执行这个线程上代码。但因为这个线程也是 UI 渲染线程,如果在这个线程上有某些计算一直抢占 CPU ,及会造成界面卡顿,不响应用户操作的现象。另外如果渲染执行方法在一定时间内得不到 CPU , 就会被手机认为 非法 ,APP 整个进程被杀死。
为了避免,这种造成界面卡顿的现象,这里就需要多线程,将那些非常抢占CPU资源的操作,都放到其他线程中执行。比如说,文件下载的实现。

是不是线程越多越好呢?

物极必反,任何事情最合适的就是最好的,就像找女朋友,并不是越漂亮越好,是越适合你越好。线程越多,线程之间调度消耗的资源越多,盲目的使用多线程,反而会造成整个 APP 的性能下降。哪里该用多线程,哪里不该用多线程,这个不仅仅和APP 本身相关 还和 手机硬件相关;在目前,作为程序,只要追求单核/双核CPU上的执行效率高就行了,再多的现在还体现不出来。以后,程序应该会对多核CPU进行专门的优化,要不然完全体现不出多核的优势。

为什么苹果手机 CPU 现在最多还只有4核,而且还是打折的4核?

  • 功耗问题
    多核意味着消耗更多的电量,而苹果电量一直是个问题,所以这也是为什么之前苹果会把单核性能推的这么高。
  • 核数越多优化越困难
    A10虽然是4核但是是大小核设计,只考虑大核双核性能,同时跑的还是双核。正真能对4核完美优化的app真的很少,而系统自动分配对软件的流畅程度来说真的没有很大的帮助(当然跑分软件会对多核进行专门优化),如果只跑双核的分,我相信苹果绝对能赢。优化更简单会让厂商更愿意优化、优化成本更低,这就导致了更多APP对iPhone的多核进行优化,所以体验更好。这也是苹果一直用双核的原因 。
  • 用不着
    多核大多是用在大型游戏、图片处理、视频处理等等应用上的,当然现在手机也是大多数人的游戏机 O(∩_∩)O。再多的核,但 大多数 APP 并没有针对 多核进行专门的优化,所以在目前,再多的核也没卵用。

结束语

本来想写多一点,但发现除非贴点代码,要不然要说的就这些了。最后再提一句专门性的对多核进行优化APP,除非是图片、视频、游戏这类,要不然意义并不大,所以对大多数程序来说,了解点多线程粗略的知识,就完全够用了。

你可能感兴趣的:(浅谈APP端多线程性能)