如何编写高效的Android代码(4)

这其中的关键是,我们定义了一个内部类(Foo$Inner),它需要访问外部类的私有域变量和函数。这是合法的,并且会打印出我们希望的结果"Value is 27"。

问题是在技术上来讲(在幕后)Foo$Inner是一个完全独立的类,它要直接访问Foo的私有成员是非法的。要跨越这个鸿沟,编译器需要生成一组方法:

static int Foo.access$100(Foo foo) { return foo.mValue; } static void Foo.access$200(Foo foo, int value) { foo.doStuff(value); }

内部类在每次访问"mValue"和"doStuff"方法时,都会调用这些静态方法。就是说,上面 的代码说明了一个问题,你是在通过接口方法访问这些成员变量和函数而不是直接调用它们。在前面我们已经说过,使用接口方法(getter、setter) 比直接访问速度要慢。所以这个例子就是在特定语法下面产生的一个“隐性的”性能障碍。

通过将内部类访问的变量和函数声明由私有范围改为包范围,我们可以避免这个问题。这样做可以让代码运 行更快,并且避免产生额外的静态方法。(遗憾的是,这些域和方法可以被同一个包内的其他类直接访问,这与经典的OO原则相违背。因此当你设计公共API的 时候应该谨慎使用这条优化原则)

避免使用浮点数

在奔腾CPU出现之前,游戏设计者做得最多的就是整数运算。随着奔腾的到来,浮点运算处理器成为了CPU内置的特性,浮点和整数配合使用,能够让你的游戏运行得更顺畅。通常在桌面电脑上,你可以随意的使用浮点运算。

但是非常遗憾,嵌入式处理器通常没有支持浮点运算的硬件,所有对"float"和"double"的运算都是通过软件实现的。一些基本的浮点运算,甚至需要毫秒级的时间才能完成。

甚至是整数,一些芯片有对乘法的硬件支持而缺少对除法的支持。这种情况下,整数的除法和取模运算也是有软件来完成的。所以当你在使用哈希表或者做大量数学运算时一定要小心谨慎。



---------------------正文结束,下面是我的总结---------------------

看了这么多,觉得自己可以从以下几个方面入手重构手头的代码:

1.尽量少的建立(new)对象。
2.能用静态方法的就用静态方法:良好的编程风格。(经过验证,我发现静态方法的调用和实例化方法调用性能差别不大,点这里
3.使用局部变量缓存成员变量。 (测试代码如下)

public class test {       public long a ;       public long b ;       test(long x , long y){           a = x;           b = y;       }       void reset(long x , long y){           a = x ;           b = y ;       }              static void staticMedthod(){           for(int i = 0 ; i!= 10000 ; i++){               //System.out.println("静态"+ i);                if ( i == -1){                   break;               }           }       }              void medthod(){           for(int i = 0 ; i!= 10000 ; i++){               //System.out.println("成员"+ i);                if ( i == -1){                   break;               }           }       }              public static void main(String args[]){            test mt = new test(-1,-1);           System.out.print("成员变量访问 与 局部变量 访问对比 1:\n");           long time = System.currentTimeMillis();           for (long i = 0 ; i != 1000000 ; i ++){               if ( mt.a == i ){                   i ++ ;               }                if ( mt.a == i ){                   i ++ ;               }            }           System.out.print("成员变量 : "+(System.currentTimeMillis() - time) + "ms\n");                      time = System.currentTimeMillis();                      for (long i = 0 ; i != 1000000 ; i ++){               long x = mt.a ;               if ( x == i ){                   i ++ ;               }            }           System.out.print("局部变量: "+(System.currentTimeMillis() - time) + "ms\n\n");                                 System.out.print("成员变量访问 与 局部变量 访问对比 2:\n");           time = System.currentTimeMillis();           for (long i = 0 ; i != 1000000 ; i ++){               if ( mt.a == i ){                   i ++ ;               }            }           System.out.print("成员变量 : "+(System.currentTimeMillis() - time) + "ms\n");                      time = System.currentTimeMillis();           long x = mt.a ;           for (long i = 0 ; i != 1000000 ; i ++){               if ( x == i ){                   i ++ ;               }            }           System.out.print("局部变量: "+(System.currentTimeMillis() - time) + "ms\n\n");           //多次运行发现,局部变量访问和 成员变量访问的方法 大多数情况还是局部变量访问方法好。                   }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwwjff.html