繁体   English   中英

方法中“太多”局部变量的性能影响?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM