performance - Scala 的惰性 val 的(隐藏)成本是多少?

标签 performance scala lazy-evaluation

Scala 的一个方便的功能是 lazy val,其中 val 的计算会被延迟,直到需要时(第一次访问时)。

当然,lazy val 必须有一些开销 - Scala 必须在某个地方跟踪该值是否已经被求值,并且求值必须同步,因为多个线程可能会尝试访问该值第一次同时出现。

lazy val 的成本到底是多少 - 是否有一个与 lazy val 关联的隐藏 bool 标志来跟踪它是否已被评估,什么完全同步,还有更多成本吗?

此外,假设我这样做:

class Something {
    lazy val (x, y) = { ... }
}

这与拥有两个单独的 lazy val xy 相同吗?还是我只获得一次开销? (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/

相关文章:

sql - 仅当先前的连接没有找到任何内容时才离开连接

Android HttpClient 性能

python - Python垃圾回收会那么慢吗?

scala - 如何将案例类与可变参数相匹配?

functional-programming - OCaml中的懒惰 "n choose k"

F#:低效的序列处理

php - 在 PHP 中查找两个大数组之间差异的最佳方法

scala - 声明的隐含和顺序

generics - 在 Scala 参数化(泛型)类型错误中使用 Guava 的简单缓存管理器

sql - "Lazy"在 ruby 中需要