我想我會嘗試使用FParsec編寫一個快速解析器,並很快意識到返回一個列表是一個嚴重的性能問題many
。後來我發現,使用在一個文檔的ResizeArray
替代:FParsec爲什麼使用列表?
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
?
除非團隊中的成員貢獻了這一點,否則將是最好的猜測...因此可能不適合用於計算器。從寫作類似事物的個人經驗來看,專注於以可維護的方式讓事情在性能上工作往往是更有利的策略......至少在產品的前幾個版本中。只要有「足夠快」的工作,那麼每個人都很高興。 – lzcd 2015-04-01 22:08:19
我同意但作者已回覆。 :-) – 2015-04-02 15:38:30