[英]Performance implications of “too many” local variables in method?
我被分配来扩展软件的某些组件(由其他人编写)。 它是为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并节省一些时间来访问字段/数组,但是这样大量的本地性能是否会降低性能? 例如,我听说过“套准压力”。
我只是不想在不需要的情况下重写代码(即,如果当前代码正常),并且为了对其进行概要分析,我需要重写它(否则只有一个版本-当前版本,所以没有什么可与...进行比较。)。
如果不鼓励使用“太多”的本地变量,那么是否存在不应超过的“最佳”最大值? (当然,我知道系统的堆栈大小是硬性限制。)因为是这种情况,我可能也需要修改软件的其他部分(如果原始作者足够将所有内容都放入本地用户)。
尽管许多局部变量可能会导致“寄存器压力”,但这仅意味着编译器可能会进行更多的内存获取。 但是,替代方法是(例如)用colour[0]
替换对r
引用,这从理论上讲涉及索引检查和间接提取,这可能导致提取的内存多于归因于寄存器不足的情况。
简而言之,没有简单的答案。
因此,我倾向于不讲代码,特别是如果
有证据表明原始/先前的作者是通过概要分析而得出当前设计的,或者
代码已经足够快地运行了 ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.