gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:49:33 25 4
gpt4 key购买 nike

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

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

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

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

分析此行为,我发现当使用多个解析线程时,没有一个 CPU 达到高使用率。看起来线程正在争夺某些共享资源。

查看ANTLR源代码,我在ParserATNSimulator.java中发现了以下注释:

“同一解析器的所有实例通过静态字段共享相同的决策 DFA。每个实例都有自己的 ATN 模拟器,但它们共享相同的 DecisionToDFA 字段。它们还共享一个 PredictionContextCache 对象,以确保共享所有 PredictionContext 对象在 DFA 各州之间。这造成了很大的规模差异。”

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

提前致谢!

法比安

最佳答案

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

此分支在某些方面公开了略有不同的 API,因此它不是 ANTLR 4 4.0 版本的直接替代品。

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

关于multithreading - 并行运行多个 ANTLR4 词法分析器/解析器实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15590618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com