2014-07-22 3 views
2

케이스 클래스로 정의한 DAO 객체가 있습니다. 나는 그들이 사용할 수 있습니다 전에이 계산되고 싶지 않기 때문에def vs lazy val in case 클래스

case class StudentDAO(id: Int) { 
    def getGPA: Double = // Expensive database lookup goes here 
    def getRank: Int = // Another expensive database operation and computation goes here 
    def getScoreCard: File = // Expensive file lookup goes here 
} 

자연스럽게 valgetGPAgetRankgetScoreCarddef들하고하지 않을 것입니다.

def 대신 lazy val으로 표시된 경우 성능에 미치는 영향은 무엇입니까? 내가 그들을 lazy val로 만들고 싶은 이유는 다음과 같습니다 : 나는 아이디가 "i"인 학생을 위해 매번 순위를 재 계산하고 싶지 않습니다.

나는 대부분의 차이에 대해있는 아래와 같은 몇 가지 질문이 있기 때문에이 중복으로 표시되지 않습니다 바라고 :

When to use val, def, and lazy val in Scala?

def or val or lazy val for grammar rules?

`def` vs `val` vs `lazy val` evaluation in Scala

Scala Lazy Val Question

이 퀘스트 on은 비용이 많이 드는 작업에 대해 methodlazy val을 만드는 데 소요되는 비용 (CPU와 메모리 간의 절충)을 목표로하고 있으며, 다른 작업에 대해 제안 할만한 이유와 이유는 무엇입니까?

편집 : @ om-nom-nom. 의견을 보내 주셔서 감사합니다. 내가 찾는 것을 더 분명히해야했습니다.

은 여기 읽기 :

객체의 문자열 표현을 캐시

Use of lazy val for caching string representation

(@Dave Griffith's answer 참조). 나는 그것을 대신 def

+0

들으시겠습니까? * 게으른 발은 당신에게 더 많은 10 바이트와 200 CPU주기를 소비합니까? * –

+0

@ om-nom-nom : 정확히는 아닙니다. 내 편집을 참조하십시오 :) –

답변

7

lazy val 한 경우 더 정확하게 내가 나에게 가비지 컬렉션의 영향에 매우 간단 같은데 찾고 있어요 : 나는 그들이 을 수 있습니다 전에 계산하지 않으

익숙한. [...] 아이디가 "i"인 학생에게 매번 순위를 재 계산하고 싶지 않습니다.

그런 다음 lazy val을 사용하면됩니다.

def은 일반적으로 매개 변수를 전달할 때마다 값이 변경 될 수있는 경우 사용되며 val은 변경되지 않지만 즉시 계산됩니다.

+1

값이 바뀔 수 있기 때문에'lazy val' 대신'def'를 사용하는 것이 합리적입니까? 그러면 더 나은 'def'가 될 것입니다! 가비지 수집에 미치는 영향은 무엇입니까? 내 편집을 참조하십시오. –

+1

값이 바뀔 수 있다면 그것은 분명히 'def'입니다. 'val'은 한 번 계산되며 그 것입니다. – vptheron

+0

의미가 있습니다. 값이 변경되지 않고'def '대신'lazy val'을 사용하고자한다면 GC에 어떤 영향을 미칩니 까? –

2

"보통"참조 유형 (예 : File)에 대한 lazy val은 처음 평가할 때 강력한 참조를 만드는 효과가 있습니다. 따라서 변경되지 않은 값의 재평가는 피할 수 있지만 계산 된 값을 메모리에 유지하는 데 드는 비용은 분명합니다.

기본 값 (또는 심지어 가벼운 객체 인 File)의 경우이 메모리 비용은 대개 큰 문제가되지 않습니다 (많은 양의 Student 객체를 메모리에 보유하지 않은 경우). 무거운 참조 인 경우 (예 :, 대용량 데이터 구조), 약한 참조, 다른 캐싱 접근법 또는 온 디맨드 값을 계산하는 것이 더 나을 것이다.