我一直致力于实现一个推理器,一个复杂的东西。我试图通过采用并行化的线程来提高性能,但只会增加开销。java并发性的潜在瓶颈
我的问题是除了显示器(锁)之外是否还有其他潜在的瓶颈。我从程序中删除了和volatile
等所有指标。
我使用java.util.concurrent
实用程序,并将数据拆分为线程的独立数组。
我一直致力于实现一个推理器,一个复杂的东西。我试图通过采用并行化的线程来提高性能,但只会增加开销。java并发性的潜在瓶颈
我的问题是除了显示器(锁)之外是否还有其他潜在的瓶颈。我从程序中删除了和volatile
等所有指标。
我使用java.util.concurrent
实用程序,并将数据拆分为线程的独立数组。
你可以做的最有用的想法是确保你的线程执行长序列的独立工作。这些序列需要比可能发生的开销(例如1 - 10微秒)要长得多(如1 - 10微秒)。
一个常见的错误是将工作分解得太细(在流程中产生大量开销)。每个核心只需要一个任务来保持每个核心的繁忙。
没有你想要做什么以及你如何分手你的工作的大部分细节,很难提出更具体的建议。
嗨@Peter Lawrey,谢谢你的建议。我已经达到了最多3次加速,但是在我添加了一些优化技术之后,单个工作人员的性能提高了很多,而加速消失。我想这就是你说的。你知道'static',没有'synchronized',成员是否会导致瓶颈? – 2012-02-14 21:54:01
当尝试修改共享资源时,并发发生瓶颈。您可以阅读共享资源,而不会出现瓶颈问题。 (读/写线程本地资源也不是问题) – 2012-02-15 10:08:18
非常感谢。我会做一个检查。 – 2012-02-15 20:14:05
您可以使用JProfiler运行您的应用程序来检测实际的瓶颈。 JProfiler将在加载时测试您的字节码,并为您提供内存消耗,运行时性能等方面的深入了解。
即使只阅读他们的技术论文,您也可以看看Disruptor深入讨论这个问题。
你在多核机器上测试过吗? – paislee 2012-02-14 18:01:39
您是否使用VisualVm监控您的应用程序以分析开销的来源? – 2012-02-14 18:06:44
@paislee:是的,我在八核电脑上运行它,并且通常会生成**最多** 10个线程。 – 2012-02-14 20:35:02