TPS(Transaction Per Second)
TPS为每秒处理的事务数,是系统吞吐量的指标,在搜索系统中也用QPS(Query Per Second)衡量。TPS一般与响应时间反相关。

通常所说的性能问题就是指响应时间过长、系统吞吐量过低。

Android高性能编码一:多线程并发或分布式提高TPS

Android高性能编码二:利用缓存提高TPS

Android高性能编码三:数据结构和算法优化

Android高性能编码四:代码优化


代码的细节有时也会很影响性能,在执行次数不是很频繁时并不明显,在核心的频繁的代码一定要注意细节。


1.选择ArrayList最佳的遍历方式

        //方法1        Iterator it1 = list.iterator();        while(it1.hasNext()){            System.out.println(it1.next());        }        //方法2        for(Iterator it2 = list.iterator();it2.hasNext();){             System.out.println(it2.next());        }        //方法3        for(String tmp:list){            System.out.println(tmp);        }        //方法4        int size = list.size();        for(int i = 0;i < size; i ++){            System.out.println(list.get(i));        }        //逆序        for(int i = list.size();i >=0; i --){            System.out.println(list.get(i));        }


一般第三种和第四种遍历的耗时是最低的,list的size提前取出,否则每次循环的时候都要取一次。

第四种的变种逆序可以对list的元素进行操作,不会报ConcurrentModificationException的Exception。


2.static常量加上final

public class Test {    private  final static int i1 = 0;    private  final static int i2 = 0;    private  final static int i3 = 0;    private  final static int i4 = 0;    private  final static int i5 = 0;    private  final static int i6 = 0;    private  final static int i7 = 0;    private  final static int i8 = 0;    private  final static int i9 = 0;    private  final static int i10  = 0;    private  final static int i11  = 0;    private  final static int i12 = 0;    private  final static int i13 = 0;    private  final static int i14 = 0;    private  final static int i15 = 0;    private  final static int i16 = 0;    private  final static int i17 = 0;    private  final static int i18 = 0;    private  final static int i19 = 0;    private  final static int i20 = 0;    private  final static String str1 = "Test1";    private  final static String str2 = "Test2";    private  final static String str3 = "Test3";    private  final static String str4 = "Test4";    private  final static String str5 = "Test5";    private  final static String str6 = "Test6";    private  final static String str7 = "Test7";    private  final static String str8 = "Test8";    private  final static String str9 = "Test9";    private  final static String str10 = "Test10";    public Test(){    }    public void count(){        int sum = i1+i2+i3+i4+i5+i6+i7+i8+i9+i10+i11+i12+i13+i14+i15+i16+i17+i18+i19+i20;//        Log.i("Test", "sum:"+sum);    }    public void connect(){        StringBuilder sb = new StringBuilder();        sb.append(str1);        sb.append(str2);        sb.append(str3);        sb.append(str4);        sb.append(str5);        sb.append(str6);        sb.append(str7);        sb.append(str8);        sb.append(str9);        sb.append(str10);//        Log.i("Test", "sb:"+sb.toString());    }}        long start = System.currentTimeMillis();        Log.d("Test", "startTime:"+start);        for(int i = 0; i < 10000; i++) {            Test test = new Test();            test.count();            test.connect();        }        Log.d("Test", "cost time:"+(System.currentTimeMillis()-start));

测试类

04-25 10:50:58.884 17229-17229/com.js.test2 D/Test: startTime:149308865888404-25 10:50:58.907 17229-17229/com.js.test2 D/Test: cost time:23

不加final执行耗时23毫秒

04-25 10:52:45.543 19973-19973/? D/Test: startTime:149308876554304-25 10:52:45.560 19973-19973/? D/Test: cost time:17
加final执行耗时17毫秒

static常量不加final,类加载时会在cinit方法中,为int和String变量赋值并建立字符串映射。当你加上final之后,变量会在编译时就初始化了,不必再建立字符串映射和int赋值。


3.减少布局层次

推荐使用布局RelativeLayout,虽然在写布局时会麻烦一些,但是可以有效的减少布局层次,从而减少OverDraw,减少绘制的次数,绘制是很耗费性能的。一般OverDraw为红色的区域不要超过屏幕的4分之一。

4.谨慎使用static静态变量

a.static静态变量引用有生命周期的组件的时候,比如activity、context、以及context有关的资源时,会造成这些组件不能释放内存,就造成了内存泄漏。

b.不用静态变量保存数据

在activity中使用静态变量保存数据,在activity切换时,数据有可能被清除掉。建议使用Application或者Application的子类来保存数据。


5.及时释放不工作的线程

一般单独写线程时,都能在不使用时设置为null。问题都是出在一些比较常用的封装的线程组件,比如HanderThread、线程池等。

HandlerThread start的时候会自动创建线程池并等待,如果不在退出的时候及时的释放这些线程,它们会等在那里,所以HandlerThread不使用时,要及时调用quit或quitSafely。


6.灵活使用getter和setter方法

为了封装解耦,理论上bean的所有数据都要采用getter和setter方法来访问,但是,public 直接调用变量显然要比getter方法高效,一些调用频繁的变量可以考虑直接public调用,或者直接采用内部类设计,这样兼顾解耦和性能。


7.减少浮点型的使用

Android设备使用浮点型速度比整形慢很多,而且浮点型与浮点型的运算有时并不可靠,比如1000.0f x 1000.f的结果并不等于1000000,而是等于999999.4565465,基本上商业运算采用BigDecimal更加准确。


更多相关文章

  1. Mars Android视频学习笔记——01_16_SQLite使用方法
  2. 如何在Android中用好多线程
  3. Android 总结:进阶之路(资源与方法)
  4. Android 关闭所有Activity完全退出程序方法
  5. android 图文列表的实现方法
  6. 使用universal-image-loader中出现的EOFException解决方法
  7. android 隐藏输入键盘的方法
  8. Android 使用decodeFile方法加载手机磁盘中的图片文件
  9. Android设置全屏的两种方法

随机推荐

  1. Android如何运行真机在eclipse上调试应用
  2. ADB和DDMS简介
  3. Android中的Content Provider
  4. Android(安卓)- 图片处理之Glide4.0
  5. 招聘Android手机应用开发工程师
  6. 笔记:安卓改变app名字和定位显示时间间隔
  7. WebView!!!!日记~~
  8. android-编译
  9. Android(安卓)华为手机音频设置播放倍速m
  10. Android(安卓)依赖方式的变化