0

这是顺序版本:

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 中运行此代码。JavaRuntime.runtime.availableProcessors()返回 2。

我不明白为什么使用runForkJoin比顺序代码慢得多的代码(分钟与秒)。

4

1 回答 1

2

runForJoin() 方法对代码片段中的性能没有影响。正是 withPool() 方法导致了减速。这是因为 withPool() 方法将几个 xxxParallel() 方法添加到 Groovy 对象的动态范围,这会减慢方法解析速度。

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

于 2014-05-18T07:41:17.303 回答