Я думал, что попробую написать быстрый парсер, используя 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
?
Если член команды не будет участвовать в этом, это будет предположение в лучшем случае ... и, возможно, это не подходит для stackoverflow. Из личного опыта написания подобных вещей, сосредоточение внимания на том, чтобы все, работая с сохранением работоспособности, превышало производительность, как правило, было более выгодной стратегией ... по крайней мере для первых нескольких версий продукта. Пока что-то работает «достаточно быстро», тогда все счастливы. – lzcd
Согласен, но автор ответил. :-) –