Android高效编程的实践


看过《 编写高效的Android代码》见 这篇文章,觉得挺有道理的,于是按照其说法从以下几个角度修改了自己的app代码。

1,避免建立对象。 这一点是没有问题的,java编程时都需要尽量控制new 对象的次数,每次在heap中生成新的对象是很费时的。

2,不涉及成员变量和成员方法的方法都定义为static。这一点也没有问题,姑且不论效率问题,这也是OO思想的一个体现。

3,成员变量缓存到本地。 理论上讲,成员变量的访问,是存储在heap中的,heap的访问没有stack中访问高效。而且经过java测试,我发现,对比两次使用成员变量 和 一次申请局部变量缓存后再两次使用局部变量,后者要效率高。代码如下:

  1. public class test {    
  2.     public long a ;    
  3.     public long b ;    
  4.     test(long x , long y){    
  5.         a = x;    
  6.         b = y;    
  7.     }    
  8.     void reset(long x , long y){    
  9.         a = x ;    
  10.         b = y ;    
  11.     }    
  12.         
  13.     public static void main(String args[]){     
  14.         test mt = new test(-1,-1);    
  15.         System.out.print("成员变量访问 与 局部变量 访问对比 1:\n");    
  16.         long time = System.currentTimeMillis();    
  17.         for (long i = 0 ; i != 1000000 ; i ++){  //下面是两次对成员变量的使用   
  18.             if ( mt.a == i ){    
  19.                 i ++ ;    
  20.             }     
  21.             if ( mt.a == i ){    
  22.                 i ++ ;    
  23.             }     
  24.         }    
  25.         System.out.print("成员变量 : "+(System.currentTimeMillis() - time) + "ms\n");    
  26.             
  27.         time = System.currentTimeMillis();    
  28.             
  29.         for (long i = 0 ; i != 1000000 ; i ++){  //下面先缓存为局部变量,再两次使用局部变量   
  30.             long x = mt.a ;    
  31.             if ( x == i ){    
  32.                 i ++ ;    
  33.             }  
  34.             if ( x == i ){    
  35.                 i ++ ;    
  36.             }     
  37.         }    
  38.         System.out.print("局部变量: "+(System.currentTimeMillis() - time) + "ms\n\n");    
  39.             
  40.             
  41.          
  42.     }  
  43.    }    

用于测试的app为一个surfaceview为主体的重力感应游戏。

为了体现效率方面的变化,我在surfaceview中设定一个变量记录了每60秒游戏中,真正执行代码的时间总和(游戏中使用了50ms为周期的while循环,一周期中不到50秒的会调用sleep()补全时间。这个测试时间就是累加了每个周期中执行游戏逻辑的时间)。

对修改前和修改后的程序,我分别做了二十次测试,取平均值。

意外的是,在我作出如上修改之前,平均值为23.690ms,调整代码后,测试时间平均值均为23.873ms,如此看来,反而修改后的代码有了略微的劣势。


总结:

个人认为,第一、第二条中所讲都是常规编程需要注意的内容,可以确信。

而第三条,作为应对CPU、内存能力有限的移动终端,理论上似乎不错,但实际结果运行却并不如意。

个人猜想,是否是Dalvik虚拟机本身已经对成员变量的访问方面做过了优化? 在网上搜了下,大多都说道,Dalvik是基于寄存器的虚拟机,而常规的JVM是基于栈的虚拟机。对于Dalvik , 在经过SUN JDK编译器生成字节码.class后,还会用DX工具再次优化生成.dex文件。 ��许两者本身优化策略的不同,导致了这一试验结果。

没有找到更多关于Dalvik的介绍,附一觉得不错的链接:Dalvik虚拟机浅识1 。

欢迎大家探讨。

相关内容