Antlr4.Runtime.Dfa.DFAState.Get / SetTarget()中的争用(版本4.2.2-alpha001)

时间:2014-04-16 21:33:12

标签: c# multithreading antlr4

我们正在以高度并行的方式运行使用此版本的解析器的.NET应用程序。我们在解析器/词法分析器实例化的给定线程上一次解析单行输入。我们的实施使用了首先使用SLL策略的建议做法,并在必要时回退到LL。

经过一段时间(几个小时)后,我们的应用程序变得受CPU限制。在这一点上,我们观察到大多数线程在这些方法中等待:

public virtual DFAState GetTarget(int symbol)
{
    lock (this)
    {
        if (this.edges == null)
            return (DFAState) null;
        else
            return this.edges[symbol];
    }
}

public virtual void SetTarget(int symbol, DFAState target)
{
    lock (this)
    {
        if (this.edges == null)
            this.edges = (AbstractEdgeMap<DFAState>) new SingletonEdgeMap<DFAState>(this.minSymbol, this.maxSymbol);
        this.edges = this.edges.Put(symbol, target);
    }
}

我们的理解是,在此版本中,默认情况下不会使用DFA。

  

默认情况下,DFA不会用于完整上下文解析。这个决定是由于实质性的性能提升,因此使用DFA进行全上下文解析的内存开销不再是明显的胜利。可以通过设置parser.Interpreter.enable_global_context_dfa = true来启用旧行为。

如果是这样,我们为什么会在GetTarget()SetTarget()中看到此锁定?我们有正确的运行时版本:4.2.2-alpha001?

此处的任何见解将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

DFA仍然用于SLL解析。

您应该将此作为问题发布在项目问题跟踪器上。如果您可以提供示例语法和输入,那么找到解决问题的方法将会非常有用。

https://github.com/tunnelvisionlabs/antlr4cs/issues

相关问题