当我看到“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”究竟是什么使得它比从对象中检索成员变量更昂贵?
答案 0 :(得分:2)
我认为你需要重新检查实际说的内容。幻灯片54似乎在谈论(2)和(3),并暗示它们比其他所有人都要好。 (我不能听音频流来检查实际上说的是什么......)
离开我的头顶,在(4)中如果在循环体中没有分配array
局部变量,那么array.length
可以从内存中读取一次并保存在寄存器中循环持续时间(数组的长度永远不会改变......我假设array
是本地而不是this
的字段。)
通过约束,在循环运行时,(5)this.var
可能会被另一个线程更改,因此(取决于Davlik如何实现Java内存模型)可能需要每次都重新获取循环。
但这取决于Davlik如何处理这个问题。除非this.var
声明为volatile
,否则Java语言规范不会要求重新提取实现。但它是否确实是一个可能(可能)改变的实现细节。