为什么“this.var”效率低于“array.length”?

时间:2010-10-29 05:02:33

标签: java android

当我看到“Dalvik VM Internals”谈话时,我对其中一张关于明智循环的幻灯片提出了疑问。这张幻灯片上的七个循环中有两个:

(4)for(int i = 0; i< array.length; i ++)

(5)for(int i = 0; i< this.var; i ++)

并且发言说(4)比(5)更有效。 “array”只是一个Array对象。

我的问题是“this.var”究竟是什么使得它比从对象中检索成员变量更昂贵?

1 个答案:

答案 0 :(得分:2)

我认为你需要重新检查实际说的内容。幻灯片54似乎在谈论(2)和(3),并暗示它们比其他所有人都要好。 (我不能听音频流来检查实际上说的是什么......)

离开我的头顶,在(4)中如果在循环体中没有分配array局部变量,那么array.length可以从内存中读取一次并保存在寄存器中循环持续时间(数组的长度永远不会改变......我假设array是本地而不是this的字段。)

通过约束,在循环运行时,(5)this.var可能会被另一个线程更改,因此(取决于Davlik如何实现Java内存模型)可能需要每次都重新获取循环。

但这取决于Davlik如何处理这个问题。除非this.var声明为volatile,否则Java语言规范不会要求重新提取实现。但它是否确实是一个可能(可能)改变的实现细节。