2011-10-26 4 views
4

不要なヒープ割り当てを防ぐためにlazy valを使用することが理にかなっているので、GCの仕事を少し簡単にしたいと思っています。例えば、私はそうのようなコードを書くのが習慣にしています:scala lazy val:ガベージコレクタで簡単に行ける良い方法は?

lazy val requiredParameterObject = new Foo { 
    val a = new ... 
    val b = new ... 
    // etc 
} 

for (a <- collection) a.someFunction(requiredParameterObject) 

ここでの考え方はrequiredParameterObject怠け者することによって、私はcollectionが空である場合には、ヒープの割り当てを保存していますということです。しかし、私は疑問に思っています:lazyの内部の詳細は、これを効果的なパフォーマンスの勝利にしないでください?

答えて

5

名前でlazy valを渡すことができます: - コレクションが空の場合は決してまたはFoo上記のコードでは

lazy val requiredParameterObject = new Foo { 
    val a = new ... 
    val b = new ... 
    // etc 
} 

class C { 
    def someFunction(f: => Foo) { 
     f //(1) 
    } 
} 

val collection = List(new C, new C) 
for (a <- collection) a.someFunction(requiredParameterObject) 

は、コレクションの最初の項目は、(1)でそれにアクセスしたときに、一度作成されません。

requiredParameterObjectが通常の関数である場合には、より良い結果を得ることができ、効果的にrequiredParameterObjectを必要なときに遅延呼び出しします。ただし、コレクションの要素数と同じ回数だけ呼び出すことになります。

3

similar questionここでは尋ねましたが、lazyの実装はScalaコンパイラのバージョンによって異なります。

def test(pred : Boolean) { 
    lazy val v = // ... 
    if (pred) 
    doSomething(v) 
} 

scalacのバージョンを介して実行して、その後、あなたが得るものを見るためにscalapまたはjavapでクラスファイルで覗い:おそらくあなたはこの質問に買ってあげる最も権威の答えは次のように、最小限のスニペットを書くことです。

関連する問題