我们正在以高度并行的方式运行使用此版本的解析器的.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?
此处的任何见解将不胜感激。感谢。
答案 0 :(得分:0)
DFA仍然用于SLL解析。
您应该将此作为问题发布在项目问题跟踪器上。如果您可以提供示例语法和输入,那么找到解决问题的方法将会非常有用。