设为首页 加入收藏

TOP

如何编写高效的Android代码(二)
2014-11-24 12:00:19 来源: 作者: 【 】 浏览:2
Tags:如何 编写 高效 Android 代码
是运用于其他集合对象时要小心,因为它会产生额外的对象。


枚举变量非常方便,但不幸的是它会牺牲执行的速度和并大幅增加文件体积。例如:


会产生一个900字节的.class文件(Foo$Shubbery.class)。在它被首次调用 时,这个类会调用初始化方法来准备每个枚举变量。每个枚举项都会被声明成一个静态变量,并被赋值。然后将这些静态变量放在一个名为"$VALUES"的静 态数组变量中。而这么一大堆代码,仅仅是为了使用三个整数。


这样:


Shrubbery shrub = Shrubbery.GROUND;会引起一个对静态变量的引用,如果这个静态变量是final int,那么编译器会直接内联这个常数。


一方面说,使用枚举变量可以让你的API更出色,并能提供编译时的检查。所以在通常的时候你毫无疑问应该为公共API选择枚举变量。但是当性能方面有所限制的时候,你就应该避免这种做法了。


有些情况下,使用ordinal()方法获取枚举变量的整数值会更好一些,举例来说,将:


替换为:


会使性能得到一些改善,但这并不是最终的解决之道。


请看下面的类定义:


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


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


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


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


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


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


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






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


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


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android开发:activity生命周期基.. 下一篇静态方法和实例化方法的区别

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)