2

我正在使用jdk 7的新forkjoin框架。 我得到一个任务,它必须用不同的参数多次执行。使用jdk 7的新fork连接框架的性能问题

此任务延伸RecursiveTask。有超过100个任务可以执行,可以同时执行。任务是独立的,所以不需要任何同步。 因此,我首先创建了所需的任务,并将它们传递给forkjoin线程池。 但是应用程序变得比较慢,没有任何并行性运行它。

我的第一个想法是,我创造了很多线程..这就是为什么我试图回收线程以减少对象创建开销,但这对性能没有影响。用于使用reinitialize()方法回收即时消息。再循环性能比没有任何并行性运行性能要慢。

在任务中执行的操作不是微不足道的,运行线程的持续时间从5到150毫秒。该应用程序运行在双核机器上,使用ubuntu和oracle jdk 7运行。

+0

你有没有建立一个简单的程序,简单地派生一个任务,并等待其完成,与线程做零工作,得到上下文切换时间的感觉?你知道那些时代是什么吗? – 2012-08-04 15:19:44

+0

...你会注意到与2个处理器,你的加速是至多2倍。你确定你需要100个独立的任务? – 2012-08-04 15:21:00

+0

我会尝试你的第一个评论:)如上所述,即时通讯不再使用100个独立的线程。我创建了一个固定数量的线程,这些线程是延伸RecursiveTask 的对象,如许多示例中所示。 2.之后,我设置这些对象的参数并将它们传递给池,以便同时运行。之后,我重新设置参数,只要元素可用,必须执行任务。 – lunatikz 2012-08-04 15:29:52

回答

0

CoopSoft的Edward Harned发现了用Java实现的Fork/Join设计的许多问题。

特别是,“偷工减料”遭受高度争议&在围绕多个处理器进行工作时效率低下。递归分解也不是特别有效。

如果你的任务是而不是递归 - 你说有100个,他们可以同时执行 - 那么使用ThreadPoolExecutor更简单的方法可能会更有效。

参见: