Groovy: sum() 是否比使用 inject 计算 sum 更有效?
Groovy: is sum() more efficient that calculating sum using inject?
[1, 3, 5].sum()
是否比 [1, 3, 5].inject( 0, {x, y -> x + y}
快得多?
查看以下基准:
@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
是如何实现的。在这种简单的情况下,它可能会更快,但在更高级的情况下,结果可能会相反。
您可以使用闭包自行尝试:
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)
您可能需要传递更大的列表以获得更好的案例。
[1, 3, 5].sum()
是否比 [1, 3, 5].inject( 0, {x, y -> x + y}
快得多?
查看以下基准:
@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
是如何实现的。在这种简单的情况下,它可能会更快,但在更高级的情况下,结果可能会相反。
您可以使用闭包自行尝试:
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)
您可能需要传递更大的列表以获得更好的案例。