我正在阅读android中的
SparseArray
类,并发现了以下方法:
public void removeAt(int index) {
if (mValues[index] != DELETED) {
mValues[index] = DELETED;
mGarbage = true;
}
}
显然这也可以写成:
public void removeAt(int index) { Or public void removeAt(int index) {
if (mValues[index] != DELETED) { mValues[index] = DELETED;
mValues[index] = DELETED; mGarbage = true;
if (!mGarbage) }
mGarbage = true;
}
}
Android 开发人员似乎认为数组查找
mValues[index]
比数组写入更快,但变量查找并不比变量写入更快。
这是真的吗?它取决于VM,还是编译语言的常识?
当然,右侧版本不等效 - 因为然后
mGarbage
设置为true无论值是否已更改。
左边和原来是等价的,但是没有意义。
基本上,我认为您错过了检查现有值是否允许 DELETED 的副作用:它允许
mGarbage
设置为 true 仅 如果该方法确实有效。这与从数组读取的性能无关。
这在很大程度上取决于虚拟机,我猜这个特定的代码是针对 Dalvik 虚拟机进行调整的(或者它只是 Apache Harmony 碰巧实现的任何代码)。
需要记住的一件事是,写入总是意味着一些与缓存和跨线程交互相关的成本(即,您可能需要内存屏障才能正常工作),而读取则更容易完成。
这个假设可能是正确的,尽管它在很大程度上取决于处理器和 JVM 实现。
一般原因与数组和变量关系不大,但更多与内存访问模式有关: