Groovy: закрытие значительно медленнее, чем методы?

Играя с различными алгоритмами сортировки, я был удивлен, что замыкания 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}
}
5
задан Michael Pollmeier 21 December 2011 в 23:53
поделиться