在我的Groovy应用程序中,我有一个每秒调用几次的函数,所以我想尽可能快地完成它。此函数接收对象列表,然后执行一些魔术,并返回另一个列表。返回列表的内容取决于传递给函数的列表的内容。
为了加快速度,我希望缓存返回的列表,因为函数中的魔术不会经常更改。因此,在大约99%的调用中,此函数返回相同参数的相同列表。
为了实现这样的缓存,我想使用一个地图。此映射的键应该是函数输入参数中的列表,映射的值应该是函数为该输入列表返回的列表。
我的问题是:使用任意对象列表作为Groovy映射的关键字的最佳方法是什么?我想我可以遍历地图中的所有键,并逐项比较每个列表(地图的键)。但那闻起来,我认为应该有更好更快的方式。
有什么想法吗?
答案 0 :(得分:2)
对于Groovy 2.2.x,您可以将@Memoized
AST用于在内部执行缓存的方法。
@groovy.transform.Memoized
List getMeList(List params) {
println "params passed $params"
params.reverse()
}
def paramsList = [1, 2, 4, 5, 6]
getMeList(paramsList)
getMeList(paramsList)
getMeList(paramsList)
getMeList(paramsList)
def anotherList = ['a', 'b', 'c']
getMeList(anotherList)
getMeList(anotherList)
getMeList(anotherList)
getMeList(anotherList)
当第一次调用方法时只打印一次,而其余的调用则从缓存中获得结果时,会出现差异。
答案 1 :(得分:0)
所以我最后调用hashCode()
作为输入参数列表。好的是,即使是不同的列表,我也会得到相同的哈希值,只要它们的内容相同即可。这是我想要的,我觉得这很合理。