相关疑难解决方法(0)

我可以从Dalvik和Android工具链中得到什么样的优化?

我正在开发一个高性能的Android应用程序(游戏),尽管我首先尝试编写可读性代码,但我想在脑海中留下一个关于幕后发生的事情的图片.使用C++,我已经对编译器将为我做什么和不做什么做了很好的直觉.我正在尝试为Java/Android做同样的事情.

因此这个问题.我在网上找不到这个话题.Java编译器,Dalvik转换器(dx)和/或JITter(在Android 2.2+上)是否会执行如下优化?

  • 方法内联.在什么条件下?private方法总是可以安全地内联; 这样做会吗?public final方法怎么样?关于其他类对象的方法?static方法?如果编译器可以轻松推导出对象的运行时类型,该怎么办?我要声明的方法finalstatic在可能的情况?

  • 常见的子表达式消除.例如,如果我访问someObject.someField两次,查找只会进行一次吗?如果它是对吸气剂的召唤怎么办?如果我使用一些算术表达式两次会怎么样 它只会被评估一次吗?如果我使用某些表达式的结果,我知道它的值不会改变,作为for循环的上限,该怎么办?

  • 检查数组查找的边界.工具链是否会在某些条件下消除这种情况,例如原型for循环?

  • 价值内联.访问一些public static final int总是内联?即使他们在另一个班级?即使他们在另一个包裹?

  • 分支预测.这甚至有多大问题?是否会在典型的Android设备上大幅提升性能?

  • 简单算术.将someInt * 2被取代someInt << 1

诸如此类......

java optimization android dalvik

67
推荐指数
3
解决办法
7587
查看次数

为什么有些android代码有公共字段?

关于在面向对象编程中使用公共字段有很多问题和答案,并且大多数建议不要使用公共字段有很多原因.

但是当我查看Android的代码时,我发现一些类正在使用公共字段.例如Android.view.View有公共字段mCachingFailedmAttributes.

他们为什么公开?很难想象这是谷歌和AOSP的错误.

java oop android android-view

15
推荐指数
2
解决办法
842
查看次数

避免内部吸气/安装者

在Activity.java的源代码中,我看到了一些方法:

public View findViewById(int id) {
    return getWindow().findViewById(id);
}
Run Code Online (Sandbox Code Playgroud)

和getWindow方法的定义:

public Window getWindow() {
    return mWindow;
}
Run Code Online (Sandbox Code Playgroud)

但是按照以下规则:

避免内部吸气/安装者

在像C++这样的本地语言中,通常的做法是使用getter(例如i = getCount())而不是直接访问字段(i = mCount).这是C++的一个很好的习惯,因为编译器通常可以内联访问,如果您需要限制或调试字段访问,您可以随时添加代码.

在Android上,这是一个坏主意.虚拟方法调用比实例字段查找要昂贵得多.遵循常见的面向对象编程实践并在公共接口中使用getter和setter是合理的,但在类中,您应该始终直接访问字段.

没有JIT,直接字段访问速度比调用一个简单的getter快约3倍.使用JIT(直接字段访问与访问本地一样便宜),直接字段访问比调用一个简单的getter快约7倍.在Froyo中也是如此,但是当JIT内联getter方法时,将来会有所改进.

所以我想知道为什么android开发人员不能直接访问这个mWindow对象?如果当前Android版本的JIT无法内联访问,则getWindow().findViewById(id)将比mWindow.findViewById(id)花费更多时间,而findViewById是一种相当常用的方法.

mobile android

7
推荐指数
1
解决办法
1664
查看次数

标签 统计

android ×3

java ×2

android-view ×1

dalvik ×1

mobile ×1

oop ×1

optimization ×1