Scala 的一个方便的功能是 lazy val
,其中 val
的计算会被延迟,直到需要时(第一次访问时)。
当然,lazy val
必须有一些开销 - Scala 必须在某个地方跟踪该值是否已经被求值,并且求值必须同步,因为多个线程可能会尝试访问该值第一次同时出现。
lazy val
的成本到底是多少 - 是否有一个与 lazy val
关联的隐藏 bool 标志来跟踪它是否已被评估,什么完全同步,还有更多成本吗?
此外,假设我这样做:
class Something {
lazy val (x, y) = { ... }
}
这与拥有两个单独的 lazy val
x
和 y
相同吗?还是我只获得一次开销? (x,y)
?
最佳答案
这取自 scala mailing list并给出了 Java 代码(而不是字节码)的 lazy
实现细节:
class LazyTest {
lazy val msg = "Lazy"
}
被编译为与以下 Java 代码等效的内容:
class LazyTest {
public int bitmap$0;
private String msg;
public String msg() {
if ((bitmap$0 & 1) == 0) {
synchronized (this) {
if ((bitmap$0 & 1) == 0) {
synchronized (this) {
msg = "Lazy";
}
}
bitmap$0 = bitmap$0 | 1;
}
}
return msg;
}
}
关于performance - Scala 的惰性 val 的(隐藏)成本是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3041253/