在手机端的图像处理程序中,为了提升算法运行速度,需要对程序代码进行优化。而如何优化?需要在哪些地方进行优化?这些都是我们需要思考的问题。
因此,这篇文章主要对代码优化进行相关总结,并将不定期更新,作为长期的总结笔记。
for循环中,用”!=0”代替”小于N”进行条件判断。
图像算法实现的过程中,会利用for循环语句用重复的操作处理连续的数据。
而在for循环语句中,需要进行条件判断,用“!=0”代替“小于N” 进行条件判断,能够减少1个指令,这是因为转换为汇编指令时,与零比较跳转(CBZ/CBNZ)比跳转指令(B/BL/BX/BLX/BXJ)效率高,在进行N次循环的循环体内则可以减少N个指令的执行。
如
for(i=0;i<256;i++)
可以修改成:
for(i=256;i!=0;i--)
用指针自增代替数组寻址来获取数据。
一般情况下,我们习惯用array[]来获取图像中某个像素点的数据。但是这种方式获取数据的过程需要涉及:
1、获取array的首地址;
2、首地址加上数据位置得到新的内存地址;
3、获取数据。
而指针自增的方式则是,
1、用ptr++指针指向待获取数据的地址;
2、获取数据时直接调用*ptr即可。
另外,在图像处理中,图像一般都比较大(即图像数据很多),这样的情况下,用指针自增的方式可以显著的提升代码运行速度。
如:
for(i=0;i<256;i++)
{
array[i] ... ;
}
可以修改为:
for(i=256;i!=0;i--)
{
*ptr ... ;
prt++;
}
用查表法对三角函数进行优化
使用三角函数时,可以:
1、按照所需精度预先计算出需要覆盖的范围
2、根据范围内的角度算出三角函数值,在使用时进行查表即可得到相应值。
如,
需要计算到0.001的精度时,角度的取值范围为-90到90。
因此需要预先计算出:90-(-90)/0.001=180000+1个角度对应的三角函数值。
然后在取值时,如果要取sin(3°),则是 sinValue[(3+90)/0.0001].
另外,如果三角函数涉及到除法的计算,或者说需要应用到三角函数的倒数,也可以用查表法的方式进行优化。
即将“1/三角函数”如 1/sin(…) 预先计算好作为查表用。
判断是否为偶数
之前一直都用 y%2==0来判断是否为偶数,其实还可以通过判断 y&1==0 来判断是否为偶数。