Attoparsec多字符高效解析器优化:单字符转Text的高效实现
高效实现方案
你的判断没错,多次调用pack [c]再拼接确实会带来不必要的开销——每次不仅要创建单元素列表,还要初始化小型Text对象,后续mconcat还要反复合并这些小Text,效率很低。这里有两种更高效的实现思路:
1. 一次性打包所有字符(最优解)
直接先收集所有匹配到的字符为列表,最后只做一次pack转换,彻底避免多次小Text的创建和拼接:
anyCharParser :: Parser Text anyCharParser = pack <$> manyTill anyChar endOfInput
这种方式把所有字符攒成一个列表后一次性转成Text,是效率最高的做法,因为pack处理连续字符序列的开销远低于多次零散转换。
2. 高效的单字符Text解析器
如果确实需要单独匹配单个字符并返回Text,可以用Data.Text提供的singleton函数代替pack [c]——singleton是专门为单字符场景优化的API,无需创建中间列表:
import Data.Text (singleton) singleCharParser :: Parser Text singleCharParser = singleton <$> anyChar
但注意,即使使用这个单字符解析器,如果你还是用manyTill配合mconcat,依然会有多次Text拼接的开销,所以第一种一次性打包的方案始终是首选。
内容的提问来源于stack exchange,提问作者vkubicki
相关产品推荐
相关产品推荐

