• 编写高效的Android代码


      为什么在这就意味着没有多少剩余空间给你去浪费了,因此,在你写Androi编写Android程序时要时刻考虑执行的效率,这些系统不是想象中的那么快,并且你还要考虑它电池的续航能力。写程序的时候,要尽可能的使你的代码优化而提高效率。
      对于如何判断一个系统的不合理,这里有两个基本的原则:
    1、不要做不必要做的事情。
    2、尽可能的节省内存的使用。
     
    下面是常用的几点优化建议:
    1、尽可能避免创建对象(Object)
      因为对象的创建并不是没有代价的,如果你在一个用户界面的循环中分配一个对象,你不得不强制的进行内存回收,那么就会使用户体验出现稍微“打嗝”的现象。
    当从原始的输入数据中提取字符串时,试着从原始字符串返回一个子字符串,而不是创建一份拷贝。
     
    2、使用自身方法(Use Native Methods)
      当处理字符串的时候,不要犹豫,尽可能多的使用诸如String.indexOf()、String.lastIndexOf()这样对象自身带有的方法。因为这些方法使用C/C++来实现的,
    要比在一个java循环中做同样的事情快10-100倍。
     
    3、缓冲属性调用Cache Field Lookups
      访问对象属性要比访问本地变量慢得多。你不应该这样写你的代码:
    for (int i = 0; i < this.mCount; i++)
          dumpItem(this.mItems[i]);
    而是应该这样写:
      int count = this.mCount;
      Item[] items = this.mItems;
     
      for (int i = 0; i < count; i++)
          dumpItems(items[i]);
    (我们直接使用“this”表明这些是它的成员变量)
     
    4、声明Final常量
      我们可以看看下面一个类顶部的声明:
    static int intVal = 42;
    static String strVal = "Hello, world!";
    当一个类第一次使用时,编译器会调用一个类初始化方法,这个方法将42存入变量intVal,并且为strVal在类文件字符串常量表中提取一个引用,当这些值在后面引用时,就会直接属性调用。
    我们可以用关键字“final”来改进代码:
    static final int intVal = 42;
    static final String strVal = "Hello, world!";
    这个类将不会调用类初始化方法,因为这些常量直接写入了类文件静态属性初始化中,这个初始化直接由虚拟机来处理。代码访问intVal将会使用Integer类型的42,访问strVal将使用相对节省的“字符串常量”来替代一个属性调用。
    将一个类或者方法声明为“final”并不会带来任何的执行上的好处,它能够进行一定的最优化处理。例如,如果编译器知道一个Get方法不能被子类重载,那么它就把该函数设置成Inline。
     
    5、避免浮点类型的使用
      嵌入式的处理器通常并不支持浮点数的处理,因此所有的“float”和“double”操作都是通过软件进行的,一些基本的浮点数的操作就需要花费毫秒级的时间。
    同事,即使是整数,一些芯片也只有乘法而没有除法。在这些情况下,整数的除法和取模操作都是通过软件实现。
     
    6、避免列举类型Avoid Enums
      列举类型非常好用,当考虑到尺寸和速度的时候,就会显得代价很高,例如:
    public class Foo {
       public enum Shrubbery { GROUND, CRAWLING, HANGING }
    }
    这会转变成为一个900字节的class文件(Foo$Shrubbery.class)。第一次使用时,类的初始化要在独享上面调用方法去描述列举的每一项,每一个对象都要有它自身的静态空间,整个被储存在一个数组里面(一个叫做“$VALUE”的静态数组)。那是一大堆的代码和数据,仅仅是为了三个整数值。
    Shrubbery shrub = Shrubbery.GROUND;
    这会引起一个静态属性的调用,如果GROUND是一个静态的Final变量,编译器会把它当做一个常数嵌套在代码里面。
     
     
  • 相关阅读:
    110、抽象基类为什么不能创建对象?
    109、什么情况会自动生成默认构造函数?
    108、如果想将某个类用作基类,为什么该类必须定义而非声明?
    107、类如何实现只能静态分配和只能动态分配
    106、C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道吗?
    hdoj--2036--改革春风吹满地(数学几何)
    nyoj--46--最少乘法次数(数学+技巧)
    vijos--P1211--生日日数(纯模拟)
    nyoj--42--一笔画问题(并查集)
    nyoj--49--开心的小明(背包)
  • 原文地址:https://www.cnblogs.com/aiguozhe/p/3730848.html
Copyright © 2020-2023  润新知