Android系统性能优化总结

Android系统性能优化总结 
以下从几个不同的角度总结一下应用程序性能优化的一些方法。

一.编程思想上

     应用层的性能优化通常可以从以下几个方面考虑: 
         1. 高效的编码方式:了解编程语言的编译原理,使用高效编码方式从语法上提高程序性能;

         2. 合理的数据结构和算法:采用合理的数据结构和算法提高程序性能,这往往是决定程序性能的关键;

         3. 重视界面布局优化:对于布局复杂的界面,可以选择不要一次性的加载上,动态加载页面是一个好办法

         4. 数据的加载以及获取方式:采用多线程、缓存数据、延迟加载、提前加载等手段,解决严重的性能瓶颈;

         5. 合理配置虚拟机堆内存使用上限和使用率,减少垃圾回收频率;

         6. 合理使用native代码;

         7. 使用合理的数据库类型和SQL语句的拼写方式:合理配置数据库缓存类型和优化SQL语句加快读取速度,使用事务加快写入速度;

         8. 使用工具分析性能问题,找出性能瓶颈;

二:代码编写和系统设计

       决定程序整体性能的仍然取决于程序的业务逻辑设计、代码的数据结构和算法,写出高效的代码需要遵循两条原则: 
          (1).不执行不必要的操作;

          (2).不分配不必要的内存;

          两条原则分别针对CPU和内存,完成必要操作的前提下尽可能的节省CPU和内存资源,自然执行效率要高。从以下方面具体说明:

     1. 避免创建不必要的对象

创建太多的对象会造成性能低下,这谁都知道,可是为什么呢?首先分配内存本身需要时间,其次虚拟机运行时堆内存使用量是有上限的,当使用量到达一定程度时会触发垃圾回收,垃圾回收会使得线程甚至是整个进程暂停运行。可想而知,如果有对象频繁的创建和销毁,或者内存使用率很高,就会造成应用程序严重卡顿。 
      2.合理使用static成员 
(1).如果一个方法不需要操作运行时的动态变量和方法,那么可以将方法设置为static的。

(2).常量字段要声明为“static final”** 
     因为这样常量会被存放在dex文件的静态字段初始化器中被直接访问,否则在运行时需要通过编译时自动生成的一些函数来初始化。此规则只对基本类型和String类型有效。

(3).不要将视图控件声明为static,因为View对象会引用Activity对象,当Activity退出时其对象本身无法被销毁,会造成内存溢出。

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

(5). 使用for-each循环 
     优先使用for-each循环通常情况下会获得更高的效率;除了一种情况,即对ArrayList进行遍历时,使用手动的计数循环效率要更高。

三:布局优化的重要性:

    1.布局直接影响到界面的显示时间。关于界面布局的性能优化在技术上并没有难点,个人认为最重要的是是否认识到布局优化的重要性。起初我也会觉得布局本身不会是性能瓶颈,并且也很难优化,好不容易写了复杂的布局文件,或者原生代码就是那样,而且也用log查看了setContentView的时间,似乎没什么问题,实在是不想去研究。但实际上布局问题没有想象的那么简单。

        布局的性能优化之所以重要,因为以下两个方面:

       (1).布局文件是一个xml文件,inflate布局文件其实就是解析xml,根据标签信息创建相应的布局对象并做关联。xml中的标签和属性设置越多,节点树的深度越深,在解析时要执行的判断逻辑、函数的嵌套和递归就越多,所以时间消耗越多;

       (2).inflate操作只是布局影响的第一个环节,一个界面要显示出来,在requestLayout后还要执行一系列的measure、layout、draw的操作,每一步的执行时间都会受到布局本身的影响。而界面的最终显示是所有这些操作完成后才实现的,所以如果布局质量差,会增加每一步操作的时间成本,最终显示时间就会比较长。

    2.那么布局如何优化?总结如下几点:

(1). 遵循一条规则:布局层次尽量少

      也就是说,在达到同样布局效果的前提下,xml文件中树的深度尽量的潜。要做到这一点需要合理的使用布局控件:典型的情况是你可以使用RelativeLayout来代替LinearLayout实现相同的布局效果;

      合理的使用标签,如果布局X可以被include到Y中,那么需要考虑X的根节点是否可以设置为,这样在解析时会将的子节点添加到Y中,而本身不会添加。

(2). 使用布局优化工具检测

四:性能优化总结

      性能优化是一个很大的话题,除了讨论如何优化外,还有一个更重要的就是是否需要优化。早在几十年前,就有很多关于性能优化的讨论,然后得出一个深刻的真理:优化更容易带来伤害,而不是好处,特别是不成熟的优化。在优化过程中,你产生的软件可能既不快速,也不正确,而且还不容易被修正。不要因为性能而牺牲合理的结构。努力编写好的程序而不是快的程序。但是,这并不意味着,在完成程序之前你就可以忽略性能问题。实现上的问题可以通过后期的优化而被改正,但遍布全局并且限制性能的结构缺陷几乎是不可能被改正的,除非重新编写程序。在系统完成之后再改变你的设计的某个基本方面,会导致你的系统结构病态,从而难以维护和改进。因此你应该在设计过程中考虑性能问题。努力避免那些限制性能的设计。考虑你的代码设计的性能后果。为获得好的性能而对代码进行曲改,是一个非常不好的想法。在每次做优化之前和之后,需要对性能进行测量。



原帖:http://blog.csdn.net/u014225510/article/details/49228489


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值