我想我会尝试使用 FParsec 编写一个快速解析器,并很快意识到many
返回列表是一个严重的性能问题。ResizeArray
然后我发现了一个在文档中使用 a 的替代方法:
let manyA2 p1 p =
Inline.Many(firstElementParser = p1,
elementParser = p,
stateFromFirstElement = (fun x0 ->
let ra = ResizeArray<_>()
ra.Add(x0)
ra),
foldState = (fun ra x -> ra.Add(x); ra),
resultFromState = (fun ra -> ra.ToArray()),
resultForEmptySequence = (fun () -> [||]))
let manyA p = manyA2 p p
在我的代码中使用它会使其运行速度提高几倍。那么为什么 FParsec 默认使用列表而不是ResizeArray
?