实际上,不仅仅是android手机开发,所有的软件开发都要注意代码效率的问题!一般来说,实现相同的功能尽量较少地使用内存,最少的指令是一个优秀开发者需要时刻注意的!这里从两点来讨论这个问题:
(一)数据类型选择
首先来讨论基本数据类型的选择。对于一个32位的ARM,我们来看看两个16位的数相加的汇编代码:
000016d0 <add_16_16>
16d0: e0810000 add r0, r1, r0
16d4: e6bf0070 sxth r0,r0
16d8: e12fff1e bx 1r
可以看出16位的数据相加需要三条指令。下面我们来看看两个double的数据想加的汇编指令:
00001728 <add_double_double>
1728: ec410b16 vmov d6, r0, r1
172c: ec432b17 vmov d7,r2,r3
1730: ee366b07 faddd d6, d6,d7
1734: ec510b16 vmov r0, r1, d6
1738: e12fff1e bx 1r
可以得出结论,实际上,不同数据类型的使用其效率时完全不一样!
实际上,贸然说使用较小的数据类型效率高是不准确的!对于32的处理器,其32数据类型的效率时最高的!不过总的来说,在数据类型选择上遵循两个原则:
(1)尽量选择数据类型小的
(2)尽量选择相同类型的数据类型来操作:算数/比较等。也就是尽量防止不必要的强制转换。
一般来说,16位的数据排序的效率要远远快于32位64位。
(二) 缓存
然后我们要说一下缓存。客观的来讲:指令越多,操作的数据量越大其效率就越低!为此,处理器有自己的办法,那就是合理的使用缓存!现在处理器缓存技术已经很普遍,通常也有多级缓存!缓存的特点:效率高!成本高!所以一般情况下缓存不可能无限制的使用!缓存的目的就是保证处理器的效率,把常用的数据/指令或者他认为将要用到的数据和指令保存下来以此来满足处理器用的时候能改快速找到!
所以,为保证效率,我们需要最大限度的让处理器能在缓存中找到他需要的数据和指令。一般情况下,那些常常被使用到的就容易在缓存中存在,或者相邻的相同的数据类型,必然数组等,都有可能被提前读到缓存中以便处理器能改快速找到!所以,一般情况下顺序访问数组中的数据比随机访问数据效率高!