gpt4 book ai didi

performance - 常规 : closures significantly slower than methods?

转载 作者:行者123 更新时间:2023-12-04 02:41:39 26 4
gpt4 key购买 nike

在使用不同的排序算法时,我很惊讶 Groovy 闭包的表现非常糟糕。到目前为止,我找不到一个好的答案,所以现在在这里碰碰运气;) 为什么 Groovy 闭包比传统方法慢这么多?

这是一个显示性能差异的简单示例。它使用随机数创建两个列表,并以相反的顺序对它们进行排序,测量排序时间。在我的机器上,对于 10k 个元素,它需要 270 毫秒 使用封闭且仅 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}
}

最佳答案

只是在 Ubuntu 上使用 OpenJDK 1.6 (O6) 和 JDK 1.7 (J7) 更新 Groovy 2.0.5。

我还添加了两种可能的实现:

  • 仅提供一个闭包作为 Comparator 的实现:
  • 一个用@CompileStatic 注释的方法:
    def numberCount = 10000
    def random = new Random()
    def unorderedList1 = (1..numberCount).collect{random.nextInt()}
    def unorderedList2 = (1..numberCount).collect{random.nextInt()}
    def unorderedList3 = (1..numberCount).collect{random.nextInt()}
    def unorderedList4 = (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 map of closures") {
    def comparator= [ compare: { a,b -> return b <=> a }] as Comparator
    unorderedList1.sort(comparator)
    }

    timeit("compare using one closure") {
    def comparator= { a, b -> return b <=> a } as Comparator
    unorderedList2.sort(comparator)
    }

    timeit("compare using method") {
    Comparator comparator = new MyComparator()
    unorderedList3.sort(comparator)
    }

    timeit("compare using method with @CompileStatic") {
    Comparator comparator = new MyComparator2()
    unorderedList4.sort(comparator)
    }

    class MyComparator implements Comparator {
    int compare(a, b) {return b <=> a}
    }

    class MyComparator2 implements Comparator<Integer> {
    @groovy.transform.CompileStatic
    int compare(Integer a, Integer b) {return b <=> a}
    }

  • Groovy 2.0.5 groovy groovyc
    O6 O6 J7
    关闭 map 258 499 146
    一次关闭 64 205 48
    方法 29 37 32
    @CompileStatic 方法 28 26 22

    请注意,我没有安装使用 JDK7 编译的 Groovy 命令行(我拉的那个自动安装了自己的 OpenJDK6),因此缺少相应的列。

    关于performance - 常规 : closures significantly slower than methods?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6562598/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com