Играя с различными алгоритмами сортировки, я был удивлен, что замыкания 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}
}