Android性能优化——代码优化

1、7个思想:

  • 了解编程语言的编译原理,使用高效编码方式从语法上提高程序性能
  • 采用合理的数据结构和算法提高程序性能,决定程序性能的关键
  • 采用多线程、缓存数据、延迟加载、提前加载等手段,解决严重的性能瓶颈
  • 合理配置虚拟机堆内存使用上限和使用率,减少垃圾回收频率
  • 合理使用native代码
  • 合理配置数据库缓存类型和优化SQL语句加快读取速度,使用事务加快写入速度
  • 使用工具分析性能问题,找出性能瓶颈

2、2个原则

  • 不执行不必要的操作
  • 不分配不必要的内存

具体优化策略

1、合理使用static成员

  • 如果一个方法不需要操作运行时的动态变量和方法,那么可以将方法设置为static的
  • 常量字段要声明为“static final”,因为这样常量会被存放在dex文件的静态字段初始化器中被直接访问,否则在运行时需要通过编译时自动生成的一些函数来初始化,此规则只对基本类型和String类型有效
  • 不要将视图控件声明为static,因为View对象会引用Activity对象,当Activity退出时其对象本身无法被销毁,会造成内存溢出

2、避免内部的Getters/Setters

面向对象设计中,字段访问使用Getters/Setters通常是一个好的原则,但是在Android开发中限于硬件条件,除非字段需要被公开访问,否则如果只是有限范围内的内部访问(例如包内访问)则不建议使用Getters/Setters。在开启JIT时,直接访问的速度比间接访问要快7倍。

3、数据类型的选择

  • 字符串拼接用StringBuilder代替String,在非并发情况下用StringBuilder代替StringBuffer

    如果你对字符串的长度有大致了解,如100字符左右,可以直接new StringBuilder(128)指定初始大小,减少空间不够时的再次分配。

  • 64位类型如long double的处理比32位如int慢
  • final类型存储在常量区中读取效率更高

4、 数据结构选择

常见的数据结构选择如:

  • ArrayList和LinkedList
    ArrayList根据index取值更快,LinkedList更占内存、随机插入删除更快速、扩容效率更高。一般推荐ArrayList。
  • ArrayList、HashMap、LinkedHashMap、HashSet
    hash系列数据结构查询速度更优,ArrayList存储有序元素,HashMap为键值对数据结构,LinkedHashMap可以记住加入次序的hashMap,HashSet不允许重复元素。
  • HashMap、WeakHashMap
    WeakHashMap中元素可在适当时候被系统垃圾回收器自动回收,所以适合在内存紧张型中使用。
  • Collections.synchronizedMap和ConcurrentHashMap
    ConcurrentHashMap为细分锁,锁粒度更小,并发性能更优。Collections.synchronizedMap为对象锁,自己添加函数进行锁控制更方便。
  • Android也提供了一些性能更优的数据类型,如SparseArray、SparseBooleanArray、SparseIntArray、Pair
    Sparse系列的数据结构是为key为int情况的特殊处理,采用二分查找及简单的数组存储,加上不需要泛型转换的开销,相对Map来说性能更优

猜你喜欢

转载自blog.csdn.net/jianiuqi/article/details/54410538