1. ホーム
  2. performance

[解決済み] Scalaのlazy valの(隠れた)代償は何なのか?

2022-04-23 12:47:40

質問

Scalaの便利な機能の1つに lazy val を評価することができます。 val は必要なときまで(最初のアクセス時)遅延されます。

もちろん lazy val Scala は値がすでに評価されたかどうかを追跡しなければなりませんし、複数のスレッドが同時に初めて値にアクセスしようとするかもしれないので、評価は同期化されなければなりません。

のコストとは一体何なのでしょうか? lazy val - に関連する隠されたブーリアン・フラグがあるのでしょうか? lazy val 評価されたかどうか、同期されたものは何か、さらにコストはかかるのか?

さらに、こんなことをしたとします。

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

これは、2つの別々の lazy val s x そして y それとも、オーバーヘッドを得るのは一度だけなのでしょうか? (x, y) ?

解決方法は?

からの引用です。 scalaメーリングリスト の実装の詳細を説明します。 lazy を(バイトコードではなく)Javaコードで表示します。

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;
  }

}