Android性能提示(2)

本文探讨了提高Android应用性能的方法,包括内部类访问权限的选择、避免使用浮点数、利用系统库、谨慎使用Native方法等实践建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6. 在私有内部类,优先考虑包访问权限,而不是私有访问权限

如下的类:

public class Foo {
    private class Inner {
        void stuff() {
            Foo.this.doStuff(Foo.this.mValue);
        }
    }

    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);
    }
}
这里我们定义了一个私有内部类,它直接访问了了外部类的一个私有方法和一个私有实例域。

问题是,虚拟机认为从Foo$Inner直接访问Foo的私有成员是非法的,因为Foo和Foo$Inner是两个不同的类,尽管Java语言语序内部类访问外部类的私有成员。为了缩小这个差距,编译器生成了一系列的合成方法:

/*package*/ static int Foo.access$100(Foo foo) {
    return foo.mValue;
}
/*package*/ static void Foo.access$200(Foo foo, int value) {
    foo.doStuff(value);
}
内部类将会访问这些static方法,当它尝试访问外部类的mValue成员或者doStuff方法。上边的代码可以归结为,从哪里使用存取器方法访问域。上一篇我们提到了使用存取器方法比直接访问要慢,所以这里既有一个造成不可见的性能影响的实例。

在性能敏感的场合,通过在内部类定义域和方法的访问权限为包访问,可以避免上述性能问题。不过问题是,这些域就可以被同包的其它类访问了,所以在共有的API中,不能这么做。

7. 避免使用浮点数

根据经验,在android设备上,浮点数要比int慢2倍以上。

在速度方面,float和double在现代的硬件上几乎没有差别。从空间来讲,double是float的2倍。在台式设备上,空间不是个大问题,可以优先使用double。

即便对于整形,一些设备上有乘法加速,但是却没有除法加速,整数除法和求余是用软件实现的。当设计一个哈希表,或者进行大量数学运算时,要考虑这点。

8. 了解并使用库

系统库都经过大量的验证,性能和稳定性往往比你自己手写的代码要好很多。比如,一个系统的arrayCopy()方法,大概要比手写的loop快9倍……

9. 小心使用native方法

通过Android NDK使用native语言开发app并不比使用Java语言更高效。这是个误区。首先,在java和native语言之间的转换是需要开销的,JIT不能针对这个边界进行优化。如果分配了native的资源,很难安排时间对它们进行回收。而且native语言还需要针对不同的平台进行编译。

如果你已经有了一个native的代码库,并且想将它移植到anroid,那么native编码是很有用的;但native编程并不能帮你优化JAVA开发的app。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值