在java中获取查询的方法的并行加速问题

时间:2016-04-24 14:35:47

标签: java multithreading performance

我有以下方法对包含文字的数据集执行查询(例如p(a,b),q(c,d),r(a,d)...)。文字存储在classGuid := StringToGUID('{25DEAD04-1EAC-4911-9E3A-AD0A4AB560FD}'); interfaceGuid := StringToGUID('{FB852B2C-6BAD-4605-9551-F15F87830935}'); result := CoCreateInstance(classGuid, nil, CLSCTX_LOCAL_SERVER, interfaceGuid, trayNotify); 数据结构中,其中key是它们的谓词(例如p,q,r,...)和Literals的ArrayDequeue。此方法在回溯算法中执行,以查找规则的实例化,如: u(x,z): - p(x,y),q(y,z)。

以下方法在回溯算法中执行多次,并尝试查找与查询参数匹配的文字(例如teta = {(x = a),(y = b)}& predicate = q,元数= 2)。 我有很多规则,每个规则实例化都是由一个线程完成的(我使用的是使用ExecutorService的线程池)。以下方法是我的HotSpot。但是,我无法实现所需的加速(运行四个线程只能达到2次)。为了模拟CPU工作,我在方法中添加了Thread.Sleep(1),然后实现了预期的加速(3.9)!我在数据位置或缓存未命中时遇到问题吗?我的以下结构缓存是否足够友好?

除了我对象的分配率是13字节/秒,我在一台机器上运行应用程序,该机器有4个CPU内核,1.8 JDK并运行4个线程。

Map<String, Queue<Literal>>

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

问题很可能是线程共享数据的争用。在模拟线程中的本地工作时相对性能提高的事实与此一致,因为使用暂停模拟工作实际上并不访问任何共享对象或资源。

您的代码段没有提供足够的信息以确定其他详细信息,但indexedFactsWithAllFreeVars可能是争用的资源,因为如果在线程之间共享它很可能,应该是,同步访问。但是,根据您的模拟工作的结果,如果实际上将在线程中执行实际工作,并且只要该实际工作不争用共享资源,您可以在实际情况下获得预期的加速,所以这可能不是一个真正的问题..