为什么GPars runForkJoin即使没有forkOffChild()也很慢?

时间:2014-05-17 12:16:24

标签: java multithreading groovy fork-join gpars

这是顺序版本:

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的代码比顺序代码慢得多(分钟与秒)。

1 个答案:

答案 0 :(得分:1)

runForJoin()方法对代码段中的性能没有影响。它是withPool()方法,导致减速。这是因为withPool()方法将多个xxxParallel()方法添加到Groovy对象的动态范围,这会降低方法分辨率。

将f()方法注释为@CompileStatic将为您提供预期的性能。