我正在编写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
}
我更喜欢的第一个例子,因为它不使用任何可变的,但我不知道是否访问Map
的get
方法比返回包含该计算结果的变量慢。
显然答案是“这取决于Map
的大小”,但出于好奇,我希望得到社区的意见。
谢谢!
你不能也使用memoize? http://mrhaki.blogspot.co.uk/2011/05/groovy-goodness-cache-closure-results.html – 2013-02-10 22:28:02
是的,但它对于引入闭包有点高级。这个问题实际上是一种个人的好奇心,它也适用于Java。 – 2013-02-10 22:31:49
除非这是每秒钟执行数千次的操作,否则几乎没有办法可以做到这一点。 HashMap * lookup *通常是[O(1)操作](http://en.wikipedia.org/wiki/Big_o_notation#Orders_of_common_functions),这是担心性能优化的最糟糕的地方。 – OverZealous 2013-02-11 04:31:28