2013-02-10 3 views
0

Groovy 언어에 대한 교육 자료를 작성 중이며 Closure를 설명하는 예제를 준비 중입니다. 예는 지금 내 질문은, 그래서, withCache2 개의 예제간에 더 빠른 클로저 구현

def expensiveMethod(Long a) { 
    withCache (a) { 
     sleep(rnd()) 
     a*5 
    } 
} 

"비싼"방법에 대한 간단한 캐싱 폐쇄입니다 : 다음 두 가지 구현 중 어떤 것이 가장 빠르고 그루비 더 관용적? 이 어떤 변수를 사용하지 않는

def withCache = {key, Closure operation -> 

    if (!cacheMap.containsKey(key)) { 
     cacheMap.put(key, operation()) 
    } 
    cacheMap.get(key) 
} 

또는

def withCache = {key, Closure operation -> 
    def cached = cacheMap.get(key) 
    if (cached) return cached 
    def res = operation() 
    cacheMap.put(key, res) 
    res 
} 

는 I는 제 1 예를 선호하지만 Mapget 방법을 액세스하고, 계산 결과를 포함하는 가변 복귀보다 느린 궁금 .

분명히 대답은 "이것은 Map의 크기에 달려 있지만"호기심에서 커뮤니티의 의견을 듣고 싶습니다.

감사합니다.

+0

memoize도 사용할 수 없습니까? http://mrhaki.blogspot.co.uk/2011/05/groovy-goodness-cache-closure-results.html –

+0

네,하지만 클로저를 소개하기에는 다소 앞선 것 같습니다. 이 질문은 실제로 자바에도 적용되는 개인적인 호기심입니다. –

+0

1 초에 수천 번 수행되는 작업이 아니라면 문제가 될 수있는 방법은 거의 없습니다. HashMap * lookup *은 보통 [O (1) operation] (http://en.wikipedia.org/wiki/Big_o_notation#Orders_of_common_functions)입니다. 이는 성능 최적화를 걱정할 가장 최악의 장소입니다. – OverZealous

답변

1

먼저 OverZealous에 동의합니다. 두 가지 작업에 대한 걱정은 조기 최적화입니다. 두 번째 예시는 첫 번째 예제와 동일하지 않습니다. 예를 들어, 첫 번째는 null을 허용하고, 두 번째는 if에서 Groovy-Truth를 사용합니다. 즉 빈 목록/배열 /지도처럼 false를 null로 암시합니다. 그래서 클로저 콜을 보여주고 싶다면 첫 번째 콜렉션과 함께 갈 것입니다. 좀 더 관용적 인 무언가를 원한다면 대신에 다음과 같이하십시오.

def expensiveMethod(Long a) { 
    sleep(rnd()) 
    a*5 
} 
def cache = [:].withDefault this.&expensiveMethod 
+0

안녕하세요 @blackdrag, 나는 당신의 모범을 충분히 얻지 못했습니다. .withDefault 메소드는 null ".get"연산에 대한 기본 동작 (이 경우에는 "expensiveMethod")을 사용하여지도를 장식합니다. 그러나 필자는 필자가 원하는만큼 많은 메서드에서 캐시를 사용할 수 있도록 "withCache"Closure를 사용하려고합니다. 말이된다? –

+0

메소드가 캐싱 (사용자의 방식)을 수행하도록하거나 외부 방식을 제공하는 문제입니다. 물론 다른 예제와 메서드를 사용할 수도 있습니다. 데프 expensiveMethod (오래) { 절전 (RND()) A * 5 } 데프 처리 = 가능한이 & expensiveMethod.memoize() 그루비 1.8 가입일 :. HTTP :/가장 관용적 인 방법은 이럴 것 /groovy.codehaus.org/Groovy+1.8+release+notes#Groovy18releasenotes-Closurememization 끝까지 표시하고 싶은 항목에 따라 크게 달라집니다. – blackdrag