Android的运行效率问题
16lz
2021-01-23
有一些编程习惯,在Android这里会影响到运行速度和性能,在这里我列出来一些。
一。 避免内部调用get和set方法。
在一些编程语言比如C++里,通常会get方法(e.g. i = getCount()
) 来取值而不是直接赋值(i = mCount
),这种习惯对于C++来说是很好的,但是对于Android,这是个很坏的习惯。因为调用这种方法的开销是很大的,对于OOP来说,在公共接口里使用get和set是可以理解的,但是在同一个类里,你应该使用直接赋值,而不是用get方法去赋值。直接赋值比用get方法赋值可以大约快3倍。
二。 用static final来定义常量
看一下下面这个写在一个class开头的例子。
static int intVal = 42;
static String strVal = "Hello, world!";
编译器会生成一个叫<clinit> 的初始化方法,这个方法会在这个类被执行时最先调用,这个方法会把42存到intVal里面,然后又提取一个reference给
类文件字符串表里给strVal用,等一下这些值被调用的时候,他们就会被用reference的位置来查找。
现在我们修改一下,
static final int intVal = 42;
static final String strVal = "Hello, world!";
这样的话,类就不再需要 那个<clinit>
方法了,因为这些常量已经放在静态常量初始化的文件里了,在调用的时候是直接去调用,而不是去寻找,这样速度就会快很多。
三。 用增强版的for循环语句
看一下这三个例子。
static class Foo {
int mSplat;
}
Foo[] mArray = ...
public void zero() {
int sum = 0;
for (int i = 0; i < mArray.length; ++i) {
sum += mArray[i].mSplat;
}
}
public void one() {
int sum = 0;
Foo[] localArray = mArray;
int len = localArray.length;
for (int i = 0; i < len; ++i) {
sum += localArray[i].mSplat;
}
}
public void two() {
int sum = 0;
for (Foo a : mArray) {
sum += a.mSplat;
}
}
zero()最慢,因为每次循环都要去找array的长度,开销很大。
one()快一点,因为它把所有变量都放在本地变量里,避免了寻找开销。
two()最快的啦,从jdk1.5开始用的噢。
四。 不要用Enums如果你只有几个int的话
能定义成static final int XXXXX的话就宁肯多定义几个,也不要用enums貌似省了代码而放在一起。
五。 在inner class里用package scope
看这个例子
public class Foo {
private int mValue;
public void run() {
Inner in = new Inner();
mValue = 27;
in.stuff();
}
private void doStuff(int value) {
System.out.println("Value is " + value);
}
private class Inner {
void stuff() {
Foo.this.doStuff(Foo.this.mValue);
}
}
}
这个例子中,关键点是我们从一个Inner class里调用外面类的私有变量,这在语法方面是合法的,也不会报错,但是,对于虚拟机来说,调用别的class的私有
变量是非法的,为了弥补这个不同点,虚拟机会额外生成两个方法
/*package*/ static int Foo.access$100(Foo foo) {
return foo.mValue;
}
/*package*/ static void Foo.access$200(Foo foo, int value) {
foo.doStuff(value);
}
这个inner类会在尝试调用外面私有方法和变量之前调用这两个static方法,这意味这在调用的时候不是直接调用,而是通过其他方法来访问的,这样会增加很多开销。
所以,不要用private如果你的inner class要调用的话,不过这样也会有个问题,就是其他class也可以调用了,所以在做之前,想清楚。
六。 明智的使用float
在Android设备上,Integer的运行速度比float大概快两倍,但是float和double速度没什么差别,只是double的长度比float长2倍,如果空间不是问题的话,
使用float比double好,有些硬件芯片上有integer的乘法,但是没有除法,所以除法是在软件上运行的,这也是需要考虑的问题。
好了,就简单翻译这么多吧。
更多相关文章
- android不将apk包编译到系统里的方法
- Android、iOS添加子视图方法比较
- 对Android 平台下SElinux的理解及遇到过的相关问题解决方法总结
- Android同步方法中异步操作获取返回值。
- 针对文件转移情况的Android SDK离线安装方法