在使用不同的排序算法时,我惊讶地发现Groovy闭包的性能非常差。到目前为止,我还没有找到一个好的答案,所以现在在这里尝试一下;)为什么Groovy闭包比传统方法慢得多?
以下是一个简单的例子,显示了性能差异。它创建了两个带有随机数字的列表,并按相反顺序对它们进行排序,测量排序时间。在我的机器上,对于10k个元素,使用闭包需要270毫秒,而使用Comparator实现只需要50毫秒。
根据随机数的分布,计时会有些变化。此外,我尝试过Groovy 1.7.4和1.8.0,在后者中性能略有提高。但总体情况保持不变:闭包的性能很差。
除了不使用闭包之外,我该怎么做来提高闭包的性能呢?我是否遗漏了什么,或者在Groovy中如果性能很重要就不应该使用闭包?
以下是一个简单的例子,显示了性能差异。它创建了两个带有随机数字的列表,并按相反顺序对它们进行排序,测量排序时间。在我的机器上,对于10k个元素,使用闭包需要270毫秒,而使用Comparator实现只需要50毫秒。
根据随机数的分布,计时会有些变化。此外,我尝试过Groovy 1.7.4和1.8.0,在后者中性能略有提高。但总体情况保持不变:闭包的性能很差。
除了不使用闭包之外,我该怎么做来提高闭包的性能呢?我是否遗漏了什么,或者在Groovy中如果性能很重要就不应该使用闭包?
def numberCount = 10000
def random = new Random()
def unorderedList1 = (1..numberCount).collect{random.nextInt()}
def unorderedList2 = (1..numberCount).collect{random.nextInt()}
def timeit = {String message, Closure cl->
def startTime = System.currentTimeMillis()
cl()
def deltaTime = System.currentTimeMillis() - startTime
println "$message: \ttime: $deltaTime"
}
timeit("compare using closure") {
def comparator= [ compare: { a,b -> return b <=> a }] as Comparator
unorderedList1.sort(comparator)
}
timeit("compare using method") {
Comparator comparator = new MyComparator()
unorderedList2.sort(comparator)
}
class MyComparator implements Comparator {
int compare(a, b) {return b <=> a}
}