1

Scalaz でobject Need見つけた

def apply[A](a: => A) = {
  lazy val value0: A = a
  new Need[A] {
    def value = value0
  }
}

これと(私にとってはより自然な)の違いは何ですか

def apply[A](a: => A) = {
  new Need[A] {
    private lazy val value0: A = a
    def value = value0
  }
}

パフォーマンス、生成されたコードなどの点で?

4

1 に答える 1

2

通常、時間またはスペースが重要なアプリケーションでは、2 番目の方法を優先する必要があります。その理由はバイトコードに隠されています。具体的には、

abstract class Foo { def value: Int }
class Bar {
  def out(i: => Int) = {
    lazy val v0 = i
    new Foo { def value = v0 }
  }
  def in(i: => Int) = new Foo {
    private lazy val v0 = i
    def value = v0
  }
}

次に、2 番目のケースでは、private v0: Intandbitmap$0: Booleanをバイトコードに追加し、さらに標準の遅延 val アクセサーを追加します。ただし、最初のケースでは、代わりに av0$lzy$1: runtime.IntRefと aを追加bitmap$0$1: runtime.VolatileByteRefして、同等のものを参照し、メソッドの本体で作成されIntます。したがって、ラッピングの追加レイヤーがあります。Booleanout

私のマシンでは、バージョンは、オブジェクトを作成して 1 回取得するoutのにバージョンよりも約 50% 長くかかります。invalue

于 2013-07-14T18:53:12.463 に答える