执行以下操作是否有任何性能提升:
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/