Tho*_*alc 4 java performance android local-variables dalvik
我被分配了扩展软件的某个组件(由其他人编写).它是用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
}
Run Code Online (Sandbox Code Playgroud)
呈现组件是单线程的,包含其所有成员变量.
我用Java/Dalvik反汇编程序检查了它,字节码注释表示该方法使用了41个寄存器.我假设作者将它们缓存到本地来帮助JIT并节省一些时间用于字段/数组访问,但是不是这么多的本地人反对性能?例如,我听说过"注册压力".
我只是不想在没有必要的情况下重写代码(即如果当前代码没问题),并且为了对其进行分析,我需要重写它(否则只有一个版本 - 当前版本,所以没有什么比得上...).
如果不鼓励使用"太多"当地人,那么是否有一些不应超过的"最佳"最大值?(当然,我知道系统的堆栈大小是硬限制的.)因为如果是这样的话,我可能也需要修改软件的其他部分(如果原作者非常友好地将所有内容都放入本地).
虽然许多局部变量可能导致"寄存器压力",但这只是意味着编译器可能会进行更多的内存提取.然而,另一种方法是(例如)代替引用到r
与colour[0]
这在理论上涉及一个索引检查和间接获取这可能导致比可以归因于寄存器短缺更多存储器提取.
简而言之,没有简单的答案.
所以,我倾向于单独留下代码,特别是如果
有证据表明原始/前一作者是因剖析而得出的,或者是
代码已经运行得足够快 ......
归档时间: |
|
查看次数: |
983 次 |
最近记录: |