是否缓存了维度值?

时间:2015-08-16 21:54:57

标签: android

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

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

VS

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

或者是高速缓存的维度值/优化的字节码/使其冗余的其他一些优化?

1 个答案:

答案 0 :(得分:1)

查看Resources.getDimentionPixelSize()并深入AssetManager.loadResourceValue()这是原生的,这是不可能的。但是,从var socket = require('socket.io-client')('<SERVER IP>/?token=9a05f8279436549875d1c2cd'); socket.on('connect', function () { console.log("socket connected"); }); socket.emit('event_name',{"message":"hello"}); 来源可以说出以下内容:

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()对象;
  • 至少会进行5次方法调用;

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

TypedValue

在使用Android Lollipop的S6上,它提供 816 ms ,或 8160纳秒/呼叫

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

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