执行以下操作是否有任何性能提升:
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));
}
或者是高速缓存的维度值/优化的字节码/使其冗余的其他一些优化?
答案 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()
对象; 所以,也许它是在原生的某个地方缓存的,但即便如此,对你来说肯定是免费的。 这是我为这个问题做的一些测量(只有一个线程访问资源):
TypedValue
在使用Android Lollipop的S6上,它提供 816 ms ,或 8160纳秒/呼叫。
最后,在你的情况下(我相信你有最多10-20次迭代),它在性能方面确实无关紧要。在更多的迭代和/或访问资源中的一些并发可能是重要的。
就我个人而言,我建议在外面进行,以获得更好的风格和小但仍能提高速度。