使用各种 LLM 已经有需求了,现在已经深入我的编程了,我本是一个懒惰的人,这为我解决很多我技术能力不够和经验不足的问题。但是又带来了新的问题:代码掌控力度。
本博客使用的 Markdown 是为了解析 cmark + github flavored + obsidian flavored 而实现的,目前存在以下问题:
- Tokenizer 开销,对于编程语言来说这是有必要的,但是对于 Markdown 没有必要。
- Line 开销,用于每行处理的结构体,不断进行内存分配、收集,这也是开销。
- AST 的 enum 开销,它挺大的
- GFM 的 Autolinks 未实现
- Smart punctuation 未实现
- Chinese punctuation 未实现
- 制表符存在问题
- 未通过 markdown cmark 测试
- 性能差
这一次改造我没有阅读全部的细节,全依靠 samply 和 benchmark 以及大量的测试来保证达到目标,从 samply 我看到了很多字符串内存和 vec 内存分配,移除 tokenizer 的目标就在于此,这大大减少了 vec 的使用。还降低了 String 的使用,将所有的 String 尽量推迟并只最一次分配。
本次改造直接基于 markdown-cjk-friendly 和 中文文案排版指北 针对中文做了处理
引入了 obsidian 风格 markdown 测试,通过了 commonmark、gfm 等测试。
最终,性能虽然不及 pulldown-mark, 但是性能大抵是够了。
对于相同数据,pulldown-mark 的处理大概为(parse: ~0。56ms, html: ~0.83ms), 我的为(parse: ~2。02ms, html: ~2.57ms)
核心目标是完成了,并做了 github workflow(playground 没能完成自动部署)自动推送 wasm 的 browser 和 node 版本到 npm