【发布时间】:2015-04-01 21:02:12
【问题描述】:
我想我会尝试使用 FParsec 编写一个快速解析器,并很快意识到many 返回一个列表是一个严重的性能问题。然后我在文档中发现了一个使用ResizeArray 的替代方法:
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?
【问题讨论】:
-
除非团队成员做出贡献,否则这充其量只是猜测......因此可能不适合stackoverflow。从编写类似内容的个人经验来看,专注于让事情以可维护的方式运行而不是性能往往是一种更有利可图的策略……至少对于产品的前几个版本而言。只要某件事“足够快”地工作,那么每个人都很高兴。
-
我同意,但作者已回复。 :-)
标签: fparsec