6 个版本
0.2.0-alpha.1 | 2024 年 5 月 31 日 |
---|---|
0.1.4 | 2023 年 6 月 30 日 |
0.1.3 | 2023 年 4 月 29 日 |
0.1.2 | 2023 年 1 月 13 日 |
#138 在 性能分析 中排名
每月 35 次下载
在 2 个库中使用(通过 kodept-parse)
425KB
405 行
更快的 Pest
欢迎来到 faster-pest
,这是一个用于 解析表达式语法 的高性能代码生成器。 faster-pest
是一个非官方的 pro-macro,提供了 Pest 解析器的下一级实现。它使用底层优化技巧来生成高度优化的代码,从而最小化 AST 识别过程的开销,从而实现更快的解析。
faster-pest
与标准的 Pest 语法 兼容,因此你可以轻松切换到它,而无需更改现有的语法。
使用 faster-pest
,你可以享受 Pest 的便利性和表达性,同时获得底层解析库的性能。试一试,亲自体验其中的不同!
底层使用的解析方法与原始 pest 代码没有任何共同之处。说实话,我从没看过 pest 代码库,因为从头开始更容易。还有一件事没有被重写:实际 pest 语法的解析。然而,这可能不会持续太久。我需要扩展语法以实现更多高级技巧,例如使用 Rust 代码定义复杂的规则并在 pest 语法中导入它们。
基准测试
在创建仅一周后,faster-pest
已经解析 Json 的速度比 Pest 快 705%,比 Nom 快 137%。这使得 faster-pest
与 serde_json
相当。 faster-pest
允许你接近只有 SIMD 驱动的解析器才能克服的限制。
示例
请参阅 示例文件夹 中的示例。
它包含了来自《Pest书籍》的两个示例:csv 和 ini。
它们使用了与《Pest书籍》中完全相同的代码,表明 faster-pest
是 Pest 的直接替代品。
如果你没有任何遗留的 Pest 代码库,建议不要使用 pest 兼容层。请参考其他两个示例:json 和 po。
这些是使用 faster-pest
最有效和最符合惯例的方式。它们的工作方式与 pest 兼容层相似,但其实现更为优雅。
局限性
faster-pest
仍然处于开发的早期阶段,因此它有一些局限性。以下是最重要的几个
- 有限的语法支持(缺少:stack、insens、pospred)
- 不支持 Pest 的标记符 API(你可能没有使用过)
- 错误打印是为 Linux 制作的
- 当重复提前结束时,错误可能会变得难以理解
- 并非所有内容都已测试,可能会有错误的解析行为
优化技巧(供好奇的人)
faster-pest
为每个存在的解析组件生成了两个版本。一个版本具有错误支持,另一个没有。由于错误支持会被立即丢弃(例如,在失败的分支中),所以有许多地方不需要错误支持。faster-pest
只在解析完全失败时检索错误,因此任何有效输入都只会导致调用完全无错误的代码。从开发者的角度来看,这种优化是完全透明的。- 有时将规则组合并为一个单一的规则,而 pest 则将它们分开
- 简单的字符规则重复使用迭代器适配器而不是循环
- 绕过了所有不必要的检查
- 批量分配,这使得它们相对分散
- 代码非常小,很可能经常被编译器内联
- 解析本身是完全零拷贝的
- 遍历解析标识符几乎是免费的
许可证:GPL-3.0
依赖关系
~3.5MB
~74K SLoC