5

我被指派扩展软件的某个组件(由其他人编写)。它是为 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 并为字段/数组访问节省一些时间,但是这么多本地人不是对性能不利吗?例如,我听说过“注册压力”。

我只是不想在没有必要的情况下重写代码(即,如果当前代码是好的),为了分析它,我需要重写它(否则只有一个版本 - 当前版本,所以没有什么可以与之相比的......)。

如果不鼓励使用“太多”本地人,那么是否有一些不应超过的“最佳”最大值?(当然,我知道系统的堆栈大小是硬限制。)因为如果是这种情况,我可能还需要修改软件的其他部分(如果原作者好心将所有内容都放入本地)。

4

1 回答 1

6

虽然许多局部变量可能会导致“寄存器压力”,但这仅仅意味着编译器可能会进行更多的内存获取。但是,替代方法是(例如)替换引用rcolour[0]理论上涉及索引检查和间接获取,这可能导致更多的内存获取,而不是可以归因于寄存器短缺。

简而言之,没有简单的答案。

所以,我倾向于不理会代码,特别是如果

  • 有证据表明原始/以前的作者是通过分析得出当前设计的,或

  • 代码已经运行得足够快了......

于 2013-01-06T05:23:04.100 回答