android - 维度值是否被缓存?

标签 android

执行以下操作是否有任何性能提升:

final int pixels = getResources.getDimensionPixelSize(R.dimen.pixels);
for (CustomView view: views) {
    view.setPixelValue(pixels);
}

对比

for (CustomView view: views) {
    view.setPixelValue(getResources.getDimensionPixelSize(R.dimen.pixels));
}

或者维度值是否被缓存/字节码被优化/一些其他优化使得这变得多余?

最佳答案

查看Resources.getDimentionPixelSize()更深入直到AssetManager.loadResourceValue()哪个是本地的,这是不可能的。但是,从 Resources.getDimentionPixelSize() 来源可以说出以下内容:

public int getDimensionPixelSize(int id) throws NotFoundException {
    synchronized (mAccessLock) {
        TypedValue value = mTmpValue;
        if (value == null) {
            mTmpValue = value = new TypedValue();
        }
        getValue(id, value, true);
        if (value.type == TypedValue.TYPE_DIMENSION) {
            return TypedValue.complexToDimensionPixelSize(
                    value.data, mMetrics);
        }
        throw new NotFoundException(
                "Resource ID #0x" + Integer.toHexString(id) + " type #0x"
                + Integer.toHexString(value.type) + " is not valid");
    }
}
  • 它将通过synchronized (mAccessLock) 锁定资源(阅读,如果您的某个其他线程将在同一时刻尝试访问资源 - 其中一个将等待);
  • 它将在 TypedValue.complexToDimensionPixelSize() 中调用一些 float 学;
  • 它可能会创建TypedValue 对象;
  • 它将至少执行 5 次方法调用;

所以,也许它被缓存在原生的某个地方,但即便如此,调用对你来说肯定不是免费的。 这是我针对这个问题所做的一些测量(只有单线程访问资源):

    int pixels = 0;
    Resources res = getResources();
    long ms = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        pixels = res.getDimensionPixelSize(R.dimen.my_dimen);
    }

    Log.e(TAG, "Time " + (System.currentTimeMillis() - ms));

在带有 Android Lollipop 的 S6 上,它给出了大约 816 毫秒,或 8160 纳秒/调用

最后,在你的情况下(我相信你有最多 10-20 次迭代)它在性能方面真的无关紧要。在更多迭代中和/或访问资源的某些并发性可能很重要。

就我个人而言,我建议在室外进行,以获得更好的风格和小但仍然提高速度。

关于android - 维度值是否被缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32040319/

相关文章:

android - 使用电子邮件在 react-native 中收集表单数据

android - 使用 Gradle 运行所有子项目测试

java - SparseArray 上 putAll 的等效方法

android - 无法使用 rawQuery 正确执行删除查询

java - 如何更改 GooglePlayServicesUtil.getErrorDialog() 中显示的文本?

java - 在 Android 绘制循环中查找当前时间(以毫秒为单位)的正确方法

安卓版本设置

android - 在我的 uiautomator 测试中,有什么比 sleep 更好的解决方法?

Android - 获取已发送电子邮件的回复

android - React Native 内存泄漏动画问题