转:编写高效的Android代码
写高效的Android代码
这里我们要注意的是我们定义了一个内联类,它调用了外部类的私有方法和私有属性。这是合法的调用,代码应该会显示"Value is 27"。
问题是Foo$Inner在理论上(后台运行上)是应该是一个完全独立的类,它违规的调用了Foo的私有成员。为了弥补这个缺陷,编译器产生了一对合成的方法:
/*package*/ static int Foo.access$100(Foo foo) { return foo.mValue;}/*package*/ static void Foo.access$200(Foo foo, int value) { foo.doStuff(value);}
当内联类需要从外部访问“mValue”和调用“doStuff”时,内联类就会调用这些静态的方法,这就意味着你不是直接访问类成员,而是通过公共的方法来访问的。前面我们谈过间接访问要比直接访问慢,因此这是一个按语言习惯无形执行的例子。
让拥有包空间的内联类直接声明需要访问的属性和方法,我们就可以避免这个问题,哲理诗是包空间而不是私有空间。这运行的更快并且去除了生成函数前面东西。(不幸的是,它同时也意味着该属性也能够被相同包下面的其他的类直接访问,这违反了标准的面向对象的使所有属性私有的原则。同样,如果是设计公共的 API你就要仔细的考虑这种优化的用法)
避免浮点类型的使用在奔腾CPU发布之前,游戏作者尽可能的使用Integer类型的数学函数是很正常的。在奔腾处理器里面,浮点数的处理变为它一个突出的特点,并且浮点数与整数的交互使用相比单独使用整数来说,前者会使你的游戏运行的更快,一般的在桌面电脑上面我们可以自由的使用浮点数。
不幸的是,嵌入式的处理器通常并不支持浮点数的处理,阴齿所有的“float”和“double”操作都是通过软件进行的,一些基本的浮点数的操作就需要花费毫秒级的时间。
同事,即使是整数,一些芯片也只有乘法而没有除法。在这些情况下,整数的除法和取模操作都是通过软件实现。当你创建一个Hash表或者进行大量的数学运算时,这都是你要考虑的。
一些标准操作的时间比较为了距离说明我们的观点,下面有一张表,包括一些基本操作所使用的大概时间。注意这些时间并不是绝对的时间,绝对时间要考虑到CPU和时钟频率。系统不同,时间的大小也会有所差别。当然,这也是一种有意义的比较方法,我们可以比叫不同操作花费的相对时间。例如,添加一个成员变量的时间是添加一个本地变量的四倍。
ActionTimeAdd a local variable 1Add a member variable 4Call String.length()5Call empty static native method5Call empty static method 12Call empty virtual method 12.5Call empty interface method 15Call Iterator:next() on a HashMap 165Call put() on a HashMap600Inflate 1 View from XML 22,000Inflate 1 LinearLayout containing 1 TextView 25,000Inflate 1 LinearLayout containing 6 View objects 100,000Inflate 1 LinearLayout containing 6 TextView objects 135,000Launch an empty activity 3,000,000结束语写高效的嵌入式程序的最好方法就是要搞清楚你写的程序究竟做了些什么。如果你真的想分配一个iterator类,进一切方法的在一个List中使用增强型的for循环,使它成为一个有意而为之的做法,而不是一个无意的疏漏而产生负面影响。
有备无患,搞清楚你在做什么!你可以假如你自己的一些行为准则,但是一定要注意你的代码正在做什么,然后开始寻找方法去优化它。
?
?
?
?
?
转:http://xxw8393.blog.163.com/blog/static/37256834200992714749752/