2012-02-14 97 views
0

我一直致力于实现一个推理器,一个复杂的东西。我试图通过采用并行化的线程来提高性能,但只会增加开销。java并发性的潜在瓶颈

我的问题是除了显示器)之外是否还有其他潜在的瓶颈。我从程序中删除了​​和volatile等所有指标。

我使用java.util.concurrent实用程序,并将数据拆分为线程的独立数组。

+1

你在多核机器上测试过吗? – paislee 2012-02-14 18:01:39

+1

您是否使用VisualVm监控您的应用程序以分析开销的来源? – 2012-02-14 18:06:44

+0

@paislee:是的,我在八核电脑上运行它,并且通常会生成**最多** 10个线程。 – 2012-02-14 20:35:02

回答

3

你可以做的最有用的想法是确保你的线程执行长序列的独立工作。这些序列需要比可能发生的开销(例如1 - 10微秒)要长得多(如1 - 10微秒)。

一个常见的错误是将工作分解得太细(在流程中产生大量开销)。每个核心只需要一个任务来保持每个核心的繁忙。

没有你想要做什么以及你如何分手你的工作的大部分细节,很难提出更具体的建议。

+0

嗨@Peter Lawrey,谢谢你的建议。我已经达到了最多3次加速,但是在我添加了一些优化技术之后,单个工作人员的性能提高了很多,而加速消失。我想这就是你说的。你知道'static',没有'synchronized',成员是否会导致瓶颈? – 2012-02-14 21:54:01

+0

当尝试修改共享资源时,并发发生瓶颈。您可以阅读共享资源,而不会出现瓶颈问题。 (读/写线程本地资源也不是问题) – 2012-02-15 10:08:18

+0

非常感谢。我会做一个检查。 – 2012-02-15 20:14:05

2
  • 潜在的瓶颈是创建新线程。如果发生这种情况,您应该考虑使用线程池。
  • 另一个瓶颈可能是通常称为方法的数组分配。

您可以使用JProfiler运行您的应用程序来检测实际的瓶颈。 JProfiler将在加载时测试您的字节码,并为您提供内存消耗,运行时性能等方面的深入了解。

0

即使只阅读他们的技术论文,您也可以看看Disruptor深入讨论这个问题。