gpt4 book ai didi

java - 方法中 "too many"局部变量的性能影响?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:54 26 4
gpt4 key购买 nike

我被分配去扩展软件的某个组件(由其他人编写)。它是为 Android 编写的,完全使用 Java(没有我所知道的 native /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 并为字段/数组访问节省一些时间,但是这个大量本地不是对性能不利吗?例如,我听说过“注册压力”。

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

如果不鼓励使用“过多”的局部变量,那么是否存在一些不应超过的“最佳”最大值? (当然,我知道系统的堆栈大小是硬性限制。)因为如果那样的话,我可能还需要修改软件的其他部分(如果原作者足够好心将所有内容都放入 locals 中)。

最佳答案

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

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

所以,我倾向于单独留下代码,特别是如果

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

  • 代码已经足够快地运行 ...

关于java - 方法中 "too many"局部变量的性能影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14179510/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com