0

我正在为 Groovy 语言编写一些培训材料,并且正在准备一个解释闭包的示例。该示例是“昂贵”方法的简单缓存闭包,withCache

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

所以,现在我的问题是:以下两种实现中的哪一种是 Groovy 中最快且更惯用的?

 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
}

我更喜欢第一个示例,因为它不使用任何变量,但我想知道访问 的get方法Map是否比返回包含计算结果的变量慢。

显然答案是“这取决于大小Map”,但出于好奇,我想听听社区的意见。

谢谢!

4

1 回答 1

1

首先,我同意 OverZealous 的观点,担心两个 get 操作是过早的优化。第二个例子也不等于第一个。例如,第一个允许 null,而第二个 on 在 if 中使用 Groovy-Truth,这意味着 null eval 为 false,例如空列表/数组/映射也是如此。所以如果你想显示调用 Closure 我会选择第一个。如果您想要更惯用的东西,我会为您的情况这样做:

def expensiveMethod( Long a ) {
    sleep(rnd())
    a*5
}
def cache = [:].withDefault this.&expensiveMethod
于 2013-02-11T09:40:04.837 回答