我正在开发一个高性能的Android应用程序(游戏),尽管我首先尝试编写可读性代码,但我想在脑海中留下一个关于幕后发生的事情的图片.使用C++,我已经对编译器将为我做什么和不做什么做了很好的直觉.我正在尝试为Java/Android做同样的事情.
因此这个问题.我在网上找不到这个话题.Java编译器,Dalvik转换器(dx)和/或JITter(在Android 2.2+上)是否会执行如下优化?
方法内联.在什么条件下?private方法总是可以安全地内联; 这样做会吗?public final方法怎么样?关于其他类对象的方法?static方法?如果编译器可以轻松推导出对象的运行时类型,该怎么办?我要声明的方法final或static在可能的情况?
常见的子表达式消除.例如,如果我访问someObject.someField两次,查找只会进行一次吗?如果它是对吸气剂的召唤怎么办?如果我使用一些算术表达式两次会怎么样 它只会被评估一次吗?如果我使用某些表达式的结果,我知道它的值不会改变,作为for循环的上限,该怎么办?
检查数组查找的边界.工具链是否会在某些条件下消除这种情况,例如原型for循环?
价值内联.访问一些public static final int总是内联?即使他们在另一个班级?即使他们在另一个包裹?
分支预测.这甚至有多大问题?是否会在典型的Android设备上大幅提升性能?
简单算术.将someInt * 2被取代someInt << 1?
诸如此类......