本文起因是团队在确定 Android 实体类变量的访问修饰符(private | public)时,存在不同的建议。
原因如下文,结果在最后:
WHY YOU SHOULDN’T USE GETTERS AND SETTERS ON ANDROID
也就是在 Android 手机中,调用 getter/setter 方法会比直接访问变量耗费更多的性能。
而在 Android Developers 的 Performance Tips 中是这么说的:
Avoid Internal Getters/Setters
However, this is a bad idea on Android. Virtual method calls are expensive, much more so than instance field lookups. It’s reasonable to follow common object-oriented programming practices and have getters and setters in the public interface, but within a class you should always access fields directly.
Note that if you’re using ProGuard, you can have the best of both worlds because ProGuard can inline accessors for you.
Google 的意思呢就是,对外提供 getter/setter,对内直接访问。使用 proguard 可以兼具性能和规范。
三星SM-G9006W 高通 骁龙801,2.5GHz,2GB
使用原文中的 DeltaExample 进行测试,部分代码如下:
Low-end device (Samsung i5500):
High-end device (LG Nexus 4):
测试结果如下图,可直接看最后一项,Task 平均执行时间
直接访问变量:
开启混淆:
发现并没有性能提升,原因是较新的 Android SDK 默认关闭了优化:
Android Proguard does not inline
与混淆前速度相同
optimize 之后,速度与 public 直接访问变量一致
与混淆前和直接混淆速度相同,此处就不多放图片了
原文转自: http://blog.qiji.tech/archives/14577