Groovy 언어에 대한 교육 자료를 작성 중이며 Closure를 설명하는 예제를 준비 중입니다. 예는 지금 내 질문은, 그래서, withCache
2 개의 예제간에 더 빠른 클로저 구현
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 예를 선호하지만
Map
의
get
방법을 액세스하고, 계산 결과를 포함하는 가변 복귀보다 느린 궁금 .
분명히 대답은 "이것은 Map
의 크기에 달려 있지만"호기심에서 커뮤니티의 의견을 듣고 싶습니다.
감사합니다.
memoize도 사용할 수 없습니까? http://mrhaki.blogspot.co.uk/2011/05/groovy-goodness-cache-closure-results.html –
네,하지만 클로저를 소개하기에는 다소 앞선 것 같습니다. 이 질문은 실제로 자바에도 적용되는 개인적인 호기심입니다. –
1 초에 수천 번 수행되는 작업이 아니라면 문제가 될 수있는 방법은 거의 없습니다. HashMap * lookup *은 보통 [O (1) operation] (http://en.wikipedia.org/wiki/Big_o_notation#Orders_of_common_functions)입니다. 이는 성능 최적화를 걱정할 가장 최악의 장소입니다. – OverZealous