主页(http://www.175shouji.com):iOS和Android到底谁更流畅?技术帝分析
在纠结了很久以后,我决定开个帖子来写iOS和Android,也算是对自己近几年来学习成果的一个总结。这个话题非常大,本人虽尽我所能查证来源,但也难免会有疏漏,有的话欢迎指出。
如果觉得概念太多看不下去就直接看加粗部分就够了。
我希望大家读完我的这篇帖子后,是这样的:
而不是:
我们应该为这个世界的多样性而感到庆幸,不是么?
一、什么是流畅?什么是卡顿?
如果我们讨论流畅和卡是建立在不同的标准上,一定会变成毫无意义的口水战。在这里,流畅我们定义为运行程序时达到60fps或以上的绘制效率,且尽可能少丢帧。卡顿我们定义为程序运行时无法达到60fps,丢帧频繁。
二、Apple和Android阵营 比是不是能带来更流畅的应用体验?
不是。两者都非常顺滑,用久了也都不卡顿。
Android定义为带有GMS推送的,带有良好Android应用生态圈的(包括少数国内优秀应用),具有Google Play服务的Android手机,拥有健康使用习惯的Android。包括但不限于Nexus,Moto,SONY,LG,htc,Samsung在没有封杀Google的市场的使用体验。
三、Apple和安卓阵营比是不是能带来更流畅的应用体验?
是。安卓(尤其是用久了)很可能会卡顿。
安卓 定义为 不带GMS推送的,缺失良好 Android 应用生态的,不具有 Google Play 服务的,基于各种“深度优化,深度定制,世界第一,跑分天王,etc.” 家,配合 “动不动就管家卫士全家桶,清理内存释放手机速度,打败全国百分之XX” 的用户的 安卓生态。
四、Apple和Android阵营硬件对比
Apple硬件处于一个什么样的水平?足够优秀的水平,Apple 是著名的硬件狂魔,并不是大家想的 iPhone 硬件远远不及 Android 阵营。
1、Android阵营目前的旗舰Soc之一是基于高通810的解决方案(MTK和三星,华为的解决方案不是很了解,欢迎补充。当然业界一般认为是三星的CPU 14nm制程更先进,所以功耗发热的表现较810更好。),它拥有8个CPU核心,20nm制程,主频高达2GHz。810纯CPU计算能力,并发计算能力优于A8。但它频率高,核心多,功耗和发热量在密集计算时也会远高于A8,发热会限制810的发挥。
2、CPU Cache方面。
A8非常慷慨地配备了高达64KB 64KB的L1 Cache,1MB L2 Cache和4MB L3 Cache,与上一代A7相同,810数据不明。但实际应用来看,似乎810配备的Cache喂不饱8个核心,存在Cache Miss的情况。(有硬件信息的朋友欢迎补充)但是,即使没有准确数据的情况下,有一件事情也是可以确定的,那就是Cache per Core数据810绝对不如A8。如果要做到一样的水平,那么810要配备128kb L1 Cache,4MB L2 Cache,16MB L3 Cache。要知道的是,这么多的Cache即使是对于Intel Core i7也是很奢侈的。而如果假设810和A8配备了一样的Cache,810的Cache per Core数据就很难看了。要知道,CPU Cache的速度远高于RAM的速度,所以小Cache带来的情况就是外围I/O经常处于等待状态,延迟了CPU计算能力的发挥。打个比方,你拿跑车引擎配个4速变速箱,引擎的能力就无法发挥了。Cache方面,A8表现优于810。
3、GPU方面。
A8配备的PowerVR Series 6XT GX6450运算能力是136.4 Gflops(533MHz)/153.6 GFlops(600MHz),稍微优于801配备的Adreno 330 ,Adreno 430则是324~388.8 GHz(600MHz)【水冷……】。毕竟当时高通设计810的时候就是用来拖4k的,图形性能Adreno 430数据上远优于GX6450,但是GX6450带1334*750相当于801带720p,带1920*1080分辨率性能也足够充裕。
4、晶体管数量。
丧心病狂的A8堆了20亿个晶体管(包括Cache,GPU,dsp),已经赶上810所有8个核的总晶体管数量了。带来了A8极其凶残的单核性能。810单核性能弱于A8。
五、系统与运行机制层面
(一)内核
1、又要开始拿Linux和Unix说事了,但很不幸的是,流畅这件事跟系统内核一点关系都没有。
2、说个老梗:
iOS基于Unix所以是Touch(响应触摸操作)——Media——Service——Core架构
Android基于Linux所以是Application——Framework——Library(包含了响应触摸操作的显示相关)——Kernal架构
所以iOS要比Android响应的快,所以iOS更流畅云云...
然而这个东西是2.x时代的,Google早就改掉了……我也不知道这种Unix内核性能优于Linux的论调为什么时不时还会冒出来……反正两者都不是实时操作系统(RTOS)。
(二)运行时(Runtime)
1、Android基于Java虚拟机,前段时间还因为这个Google和甲骨文吵上了法庭。算了回归正题,我们主要要说的运行时有Dalvik和ART(Android Runtime)两种,Dalvik是Android于Android 4.4之前所使用的默认Runtime,ART则是Android Runtime,是在4.4时引入的一种新的运行时,在L及以上版本取代Dalvik成为默认运行时,在GC机制、JNI和Stack size上都与dalvik有着很大的不同。Dalvik属于JIT(Jusi-in-time)编译器,ART属于AOT(Ahead-of-time)编译器。反正说了这么多你们只需要知道ART可以直接调用底层效率更高就对了。
其实是贴主 <编译原理> 还没啃熟你们不要打我嘤嘤嘤,有兴趣的自己去看这两个链接
2、iOS不开源,但是可以知道的是它的Object-C编译器属于GCC编译套装的一部分(感谢@InflationAaron指出:后期应该是转向了苹果主导的LLVM编译器)。
(三)渲染流水线
1、Android 3.0引入了应用端绘图的GPU加速(Hardware Canvas),Android 4.1引入了黄油计划(Project Butter),到4.1可以说Android的渲染机制已经足够优秀,只要按Design Guideline写是轻松让过渡动画达到60fps的。黄油计划包括了:
窗口三重缓冲机制(降低连续丢帧可能性)
垂直同步机制(减小应用端开始绘制到实际屏幕更新的延迟)
GL窗口缓存绘图命令的异步执行(减少应用主线程的阻塞)