我被指派扩展一个软件的某个组件(由他人编写)。它是为Android编写的,完全使用Java编写(据我所知没有本地/ C ++组件)。
在熟悉代码时,我遇到了一个方法(用于渲染类的绘图方法)。该方法涉及一个更新对象的大循环(然后另一个方法稍后将呈现它们)。该方法的创建者似乎将所有/大多数成员变量和数组以及其他对象的字段缓存到本地变量中,在循环之前。代码看起来像这样:
float[] coordArr = mCoordArr;
float[] texCoordArr = mTexCoordArr;
float[] cArray = mColArray;
// ... there are further locals too, I didn't copy all here
float[] color = mColor;
float r = color[0];
float g = color[1];
float b = color[2];
float a = color[3];
int texw = mTexW;
int texH = mTexH;
Font font = mFont;
float[] ccords = font.ccords;
float cf = font.cf;
float cu = font.cu;
int len = mCurLength;
// Update the objects
for (int i = 0; i < len; ++i) {
// A quite big loop body
// ... all locals are accessed from the loop
}
渲染组件是单线程的,其所有成员变量也是如此。我使用Java/Dalvik反汇编器进行了检查,字节码注释显示该方法使用了41个寄存器。我认为作者将它们缓存到本地变量中以帮助JIT并节省一些时间用于字段/数组访问,但这么多本地变量是否会影响性能?例如,我听说过“寄存器压力”的问题。
如果当前代码没有问题,我就不想重写它(即使没有必要)。为了对其进行分析,我需要重写它(否则只有一个版本——当前版本,因此无法与其他版本进行比较...)。
如果使用“太多”本地变量是不被鼓励的,那么是否有一种“最佳”最大值不应超过?(当然,我知道系统堆栈大小是硬限制。)因为如果是这种情况,我可能还需要修改软件的其他部分(如果原始作者足够善良将所有内容放入本地变量中)。