文档章节

Android 应用性能优化(一)JAVA代码优化

bAnxIan_coder
 bAnxIan_coder
发布于 2015/06/02 17:51
字数 1054
阅读 20
收藏 0

    最近看  Android应用性能优化一书,虽然有点老,但是大致上还是有进步的。

    自从Android版本2.2之后加入JIT,明显加快了Dalvik字节码编译成本地代码的速度,当然这样还是远远无法跟IOS的编译速度进行对比的,毕竟多了一次编译解释嘛。这章主要描写JAVA的代码优化。

拿最简单的斐波那契数列做例子,一般我们的实现思路最简便是递归实现:

public static long computeReceursively (int n)   
{  
       if( n>1 ) return computeReceursively( n - 2) + computeReceursively ( n - 1 ) ;  
       return n;  
}

    递归的效率和内存占用率太高于是我们做了以下的优化。

    第一次优化:

public static long computeReceursively (int n)   
{  
      if ( n > 1 ) {  
          long  a = 0, b = 1 ;  
          do {  
                  long tmp = b ;  
                  b += a;  
                  a = tmp;  
                } while (--n > 1 );  
          return b;  
          }  
       return n;  
      }  
}

    与刚开始的递归相比,这种迭代算法的复杂性稍微高了一点,但是因为他是线性的,所以性能更好。此次性能优化大概有一倍的时间节省。但是这里我们少考虑了一个情况,如果n大于long所能取到的最大数的时候代码就会内存溢出了,那么大家都知道long是64位的,可容纳的最大斐波那契数是第92项(我们这里不是讨论一般情况,而是尽极的思考)所以我们还要继续优化下去。java提供了一个BigInteger类,这个类的对象可以容纳任意大小的有符号整数。数据类型的问题解决了又会带出运算速度的问题,这里给出的思路是引入Android自带的LruCache类(缓存)。下面是BigInteger+LruCache的实现:

public static BigInteger computeRecursivelyWithCache ( int n ){  
        int maxSize = 4 * 8 * 1024 *1024;//32兆  
  
        LruCache<Integer,BigInteger> cache = new LruCache<Integer,BigInteger>(maxSize);  
        return computeRecursivelyWithCache(n,cache);  
  
    }  
  
    private static BigInteger computeRecursivelyWithCache(int n,  LruCache<Integer,BigInteger> cache){  
      if(n > 92 ){  
          BigInteger fN = cache.get(n);  
          if(fN == null) {  
              int m = (n/2) + (n & 1);  
              BigInteger fM = computeRecursivelyWithCache(m,cache);  
              BigInteger fM_1 = computeRecursivelyWithCache(m-1,cache);  
              if((n & 1) == 1){  
                  fN = fM.pow(2).add(fM_1.pow(2));  
              }else{  
                  fN = fM_1.shiftLeft(1).add(fM).multiply(fM);  
              }  
              cache.put(n,fN);  
          }  
          return fN;  
    }  
    return BigInteger.valueOf(iterativeFaster(n));  
  
}  
  
    private static long iterativeFaster( int n ){  
        if (n >1 ){  
            long a , b  = 1 ;  
            n--;  
            a = n & 1;  
            n/=2;  
            while (n-- > 0 ){  
                a +=b;  
                b +=a;  
            }  
            return b;  
        }  
        return n;  
    }  
  
}

    

    从这个优化思路上来看,我们还可以衍生出更多的优化,如仿CPU的做个2级缓存,把数据流大的数据放在二级缓存里面,一级缓存用作即读即用等。上述这个实现的性能区别于maxSize的大小,越大越快,然而,内存使用量可能会成为新的问题,所以作为开发人员,我们有责任选用最恰当的实现,比如N<92的时候采用递归实现,n>92的时候采用缓存实现。我们选用的方法不一定是最好的但是一定要是最合适的。

    末尾说几点写APP布局的时候可以注意的方面:

    1.尽量使用RelativeLayout代替LinearLayout,尽可能的保持“扁平化布局”。

    2.尽量减少对象的创建,尤其是占用内存大的对象,不用的时候尽量在Activity的生命周期内释放掉(别把所有的初始化都放在OnCreate,用到的时候再初始化,减少界面的响应时间)。

    3.使用ViewStub推迟对象的创建。

    以上内容是我看第一章的总结,接下来的第二和第三章描写的是NDK的使用和JNI的调用 里面包含了一系列的JNI特有方法。但是想要更加高效的编程下面涉及到针对CPU寄存器的编程,使用汇编指令来优化算法,自我感觉没有接触到大数据的时候日常代码根本用不上,什么本地Activity啊,不同的CPU架构之间的指令数据流特殊编程等等等等我也就是浏览了一下做个记录,没打算深入研究过,所以现在对NDK的使用在APP的时候能做到哪些高效的优化仍然没有具体的概念。


© 著作权归作者所有

bAnxIan_coder
粉丝 6
博文 14
码字总数 13487
作品 0
杭州
程序员
私信 提问
专题:Android 移植到 C#

甲骨文和谷歌正就谷歌在Android中使用Java一案展开一场10亿美元的大较量。 但是Java并非在Android中建立本地应用的唯一方法。事实上,它甚至不是最好的文法:我们已经将C#提供给Android开发者...

xyxzfj
2012/05/03
5K
32
Xamarin:使用C#移植Android操作系统

Oracle和Google针对Android中Java的专利问题鏖战正酣,与此同时Xamarin正在尝试使用C#移植Android操作系统,完全替换其中的Java代码。虽然这Xamarin表明这不会是公司的主要业务,但这依然会是...

虫虫
2012/05/04
10K
20
Xamarin发布XobotOS源码,C# 实现的Android系统

  Xamarin 团队(前身为 Mono 团队)近来一直在尝试使用 C# 移植 Android 操作系统,并完全替代其中的 Java 代码。之前,该团队推出了 Mono for Android,使得开发者可以使用 C# 来开发 An...

墙头草
2012/05/07
72
0
Android 正移植到C#

甲骨文和谷歌正就谷歌在Android中使用Java一案展开一场10亿美元的大较量。但是Java并非在Android中建立本地应用的唯一方法。事实上,它甚至不是最好的文法:Xamarin 开发组已经将C#提供给And...

长平狐
2012/11/12
177
0
让华为P30运行如飞的,是这个叫方舟的……

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/McIl9G4065Q/article/details/89702291

网易智能
04/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前端面试题汇总

一. HTML常见的兼容性 1.HTML5 标签在低版本浏览器不兼容 解决办法:使用html5shiv库,引入下列语句 <!--[if lte IE 8]> <script src="https://cdn.bootcss.com/html5shiv/r29/html5.js"></sc......

蓝小驴
30分钟前
7
0
OSChina 周四乱弹 —— 我气的脸都黑了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐《Red Battle》- 高橋李依 / 豊崎愛生 《Red Battle》- 高橋李依 / 豊崎愛生 手机党少年们想听歌,请使劲儿戳(这里) @丶Lion ...

小小编辑
43分钟前
575
22
找OSG教程, B站就有

https://www.bilibili.com/video/av64849038?from=search&seid=11632913960900279653

洛克人杰洛
今天
5
0
学习记录(day07-Vue组件、自定义属性、自定义事件)

[TOC] 1.1.1什么是组件 一个vue文件就是一个组件 组件将html标签/css样式/对应JS打包成一个整体,也可以理解钻进一个具有样式和特效的自定义标签。 一、编写组件(提供方)<template> <di...

庭前云落
今天
5
0
使用Prometheus监控SpringBoot应用

通过之前的文章我们使用Prometheus监控了应用服务器node_exporter,数据库mysqld_exporter,今天我们来监控一下你的应用。(本文以SpringBoot 2.1.9.RELEASE 作为监控目标) 编码 添加依赖 使...

JAVA日知录
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部