Играя с разными алгоритмами сортировки, я был удивлен, что Groovy-замыкания работали очень плохо.До сих пор я не мог найти хорошего ответа на этот вопрос, поэтому попытал счастья здесь;) Почему замыкания Groovy намного медленнее, чем традиционные методы?
Вот простой пример, показывающий разницу в производительности.Он создает два списка со случайными числами и сортирует их в обратном порядке, измеряя время сортировки.На моей машине и для элементов 10k это занимает 270 мс с использованием замыкания и только 50 мс с использованием реализации Comparator.
Время варьируется немного в зависимости от распределения случайных чисел.Также я попробовал 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}
}