Groovy:sum()更有效,使用注入计算总和?

时间:2015-03-16 14:01:55

标签: groovy

[1, 3, 5].sum()明显快于[1, 3, 5].inject( 0, {x, y -> x + y}吗?

2 个答案:

答案 0 :(得分:10)

看看以下基准:

@Grab(group='org.gperfutils', module='gbench', version='0.4.3-groovy-2.4')

def b = benchmark {
    'simple-sum' {
        [1, 3, 5].sum()
    }
    'inject-sum' {
        [1, 3, 5].inject(0, { x, y -> x + y })
    }
}
b.prettyPrint()

输出:

Environment
===========
* Groovy: 2.4.0
* JVM: Java HotSpot(TM) 64-Bit Server VM (25.5-b02, Oracle Corporation)
    * JRE: 1.8.0_05
    * Total Memory: 283.5 MB
    * Maximum Memory: 3641 MB
* OS: Mac OS X (10.10.1, x86_64)

Options
=======
* Warm Up: Auto (- 60 sec)
* CPU Time Measurement: On

            user  system  cpu  real

simple-sum   218       2  220   226
inject-sum   270       2  272   276

输出表明它几乎相同 - sum几乎在每次尝试中都快一点,但差异并不显着。还有一个look如何实现sum。在这种简单的情况下,它可能会更快,但在更高级的情况下,结果可能会被反转。

答案 1 :(得分:0)

你可以自己尝试使用闭包:

def m1 = { l ->
    l.sum()
}

def m2 = { l ->
    l.inject( 0, {x, y -> x + y})
}


def benchmark = { l, c ->
     def d1 = new Date().time
     println "sum = ${c.call(l)}"
     def d2 = new Date().time
     println d2-d1
}

println benchmark([1,3,5], m1)
println benchmark([1,3,5], m2)

您可能需要传递较大的列表以获得更好的案例。