斯卡拉的一个便捷功能是lazy val
,其中val
的评估延迟到必要时(首次访问时)。斯卡拉懒惰val的(隐藏)成本是多少?
当然,一个lazy val
必须具有一些开销 - 地方斯卡拉必须跟踪的该值是否已经被评估和评价必须是同步的,因为多个线程可能会试图同时访问该值首次时间。
lazy val
的成本究竟是什么 - 是否存在一个与lazy val
相关的隐藏布尔标志,用于跟踪它是否已经被评估,什么是同步的,是否还有更多的成本?
此外,假设我这样做:
class Something {
lazy val (x, y) = { ... }
}
这是就等于拥有两个独立的lazy val
小号x
和y
还是我得到的开销只有一次,一对(x, y)
?
我认为自2007年Java版本发布以来,实现必须发生变化。只有一个同步块,位图$ 0字段在当前实现中是不稳定的(2.8)。 – 2010-06-15 18:09:42
是的 - 我应该更多地关注我发布的内容! – 2010-06-16 09:25:34
所以,基本上,这意味着首次访问懒惰值比直接值慢(甚至可能在奇怪的情况下创建死锁),但后续访问几乎不会慢于非惰性值。看起来这不是轻率的,只是用于真正昂贵的初始化。 – 2010-11-04 09:36:31