繁体   English   中英

并行运行多个ANTLR4词法分析器/解析器实例

[英]Running multiple ANTLR4 lexer/parser instances in parallel

我正在使用ANTLRv4生成的解析器来处理具有多核的计算机上的大量文件。 为了获得额外的速度,我想并行处理文件。

为了检查解析器性能是否受CPU限制,我将文件分成几组,并使用独立的进程解析它们,每个进程在专用的JVM实例中运行相同的解析器。 这极大地提高了性能。

这鼓励我使用多个线程而不是进程尝试相同的操作,但是没有成功。 我创建了两个工作线程,每个工作线程都有自己的解析器,词法分析器和文件流实例。 返回的结果是正确的,但是,使用两个线程实际上要比使用一个线程花费更长的时间。

为了确保正确使用线程,并且确保JVM安装没有问题,我将解析代码临时替换为计算斐波那契数列的代码:在这种情况下,使用多个线程会导致性能提高。

分析此行为后,我发现使用多个解析线程时,没有一个CPU的使用率很高。 线程似乎在争夺某些共享资源。

看一下ANTLR源代码,我在ParserATNSimulator.java中找到了以下注释:

“同一解析器的所有实例都通过一个静态字段共享相同的决策DFA。每个实例都有自己的ATN模拟器,但是它们共享相同的DecisionToDFA字段。它们还共享一个PredictionContextCache对象,该对象可确保DFA之间共享所有PredictionContext对象状态。尺寸差异很大。”

我想知道对这些共享资源的同步访问是否会导致性能问题。 如果是这样,是否有可能创建这些资源的唯一实例? 还是有可能甚至更简单的解决方案?

提前致谢!

法比安

ANTLR 4运行时的参考版本被设计为在使用多个解析器线程时是安全的 (只要使用多个解析器实例)。 我维护ANTLR 4的备用(非官方)分支,该分支以不同的方式实现核心算法,以提高多线程方案中的性能。

该分支在某些方面公开了稍微不同的API,因此它并不是ANTLR 4 4.0版的直接替代。

https://github.com/sharwell/antlr4/tree/optimized

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM