这是顺序版本:
void f(long n) {
for (int i=1; i<n-1; i++) {
// do nothing
}
}
List result = []
(1..99999).each {
f(it)
result << it
}
运行代码需要几秒钟。
void f(long n) {
for (int i=1; i<n-1; i++) {
// do nothing
}
}
withPool {
runForkJoin(1,99999) { a, b ->
List result = []
(a..b).each {
f(it)
result << it
}
return result
}
}
上面的代码需要几分钟才能完成。我还没有拨打任何forkOffChild()
或childrenResults()
。我在Windows中运行此代码,使用Intel超线程(2个逻辑CPU)运行单核CPU。 Java Runtime.runtime.availableProcessors()
返回2.
我不明白为什么使用runForkJoin
的代码比顺序代码慢得多(分钟与秒)。
答案 0 :(得分:1)
runForJoin()方法对代码段中的性能没有影响。它是withPool()方法,导致减速。这是因为withPool()方法将多个xxxParallel()方法添加到Groovy对象的动态范围,这会降低方法分辨率。
将f()方法注释为@CompileStatic将为您提供预期的性能。