ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-05-29 18:47:42  阅读:314  来源: 互联网

标签:java android dalvik local-variables performance


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

我只是不想在没有必要的情况下重写代码(即如果当前代码没问题),并且为了对其进行分析,我需要重写它(否则只有一个版本 – 当前版本,所以没有什么比得上…).

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

解决方法:

虽然许多局部变量可能导致“寄存器压力”,但这只是意味着编译器可能会进行更多的内存提取.然而,替代方案是(例如)用颜色[0]替换对r的引用,理论上它涉及索引检查和间接提取,这可能导致比寄存器短缺更多的存储器提取.

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

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

>有证据表明原始/前一作者由于剖析而到达当前设计,或者
>代码已经运行得足够快……

标签:java,android,dalvik,local-variables,performance
来源: https://codeday.me/bug/20190529/1180119.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有