Performance 两个示例之间哪个闭包实现更快

Performance 两个示例之间哪个闭包实现更快,performance,groovy,closures,Performance,Groovy,Closures,我正在为Groovy语言编写一些培训材料,并准备了一个示例来解释闭包。 该示例是“昂贵”方法的简单缓存闭包,withCache def expensiveMethod( Long a ) { withCache (a) { sleep(rnd()) a*5 } } 所以,现在我的问题是:下面两个实现中,哪一个是Groovy中最快、最惯用的 def withCache = {key, Closure operation -> if

我正在为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)
 }

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

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


谢谢

首先,我同意Over热心,担心两个get操作是过早的优化。第二个exmaple也不等于第一个。例如,第一个允许null,而第二个on在if中使用Groovy Truth,这意味着null将求值为false,例如空列表/数组/映射。因此,如果你想显示呼叫结束,我会选择第一个。如果您想要更地道的东西,我会为您的案例做以下操作:

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

你不能也使用memoize吗?是的,但是它在引入闭包方面有点先进。这个问题实际上是个人的好奇心,也适用于Java。这几乎不可能是问题,除非这是一个每秒执行数千次的操作。HashMap查找通常是一个非常复杂的问题,这是最不需要担心性能优化的地方。我绝对反对过早选择。正如我所说,这基本上是幻灯片软件,这是将出现在幻灯片上的代码,而不是在任何真实环境中。我的问题更多地涉及到用Groovy来表达代码的最惯用的方式,并且,正如我所说的,是性能方面的考虑。.withDefault方法使用null“.get”操作的默认行为装饰映射,在本例中,该操作将调用“expensiveMethod”。但在我的示例中,我希望使用“withCache”闭包,以便能够在任意多个方法上使用缓存。有意义吗?这是一个让方法执行缓存(您的方式)或提供外部方式的问题。当然,您也可以在我的示例中使用其他闭包和方法。最惯用的方法是imho:def expensiveMethod(Long a){sleep(rnd())a*5}def handle=this.&expensiveMethod.memoize(),它从Groovy 1.8开始就可用:这在很大程度上取决于最终要显示什么
def expensiveMethod( Long a ) {
    sleep(rnd())
    a*5
}
def cache = [:].withDefault this.&expensiveMethod