2 min read

P2 库:Ruby 模板编译技术引领性能革命

P2 库通过将 HTML 模板编译为高效 Ruby 代码,实现了显著的性能提升,其核心在于将模板描述转化为可执行的 Ruby 语句。

P2 的编译流程始于解析模板源代码为 Prism AST,随后通过 `TagTranslator` 等类识别并转换 HTML 标签节点为自定义节点类型,如 `TagNode`。这一阶段的关键在于将声明式 DSL 映射到 AST 结构,为后续代码生成奠定基础。接着,利用 Sirop 的 `Sourcifier` 将修改后的 AST 重构为 Ruby 源代码。在这一过程中,自定义节点被翻译成具体的 HTML 生成逻辑,例如将静态 HTML 字符串与动态值分开处理,并对动态值进行适当转义,最终汇入缓冲区。

性能优化聚焦于移除不必要的 `rescue` 块,将回溯翻译延迟到 `Proc#render` 调用时进行,从而减少了每次模板渲染的开销。通过添加 `# frozen_string_literal: true` 注释,确保了静态 HTML 字符串被冻结,减少了内存分配和垃圾回收的压力。此外,将 HTML 转义从 `CGI.escape_html` 切换到更高效的 `ERB::Escape.html_escape`,进一步提升了执行效率。这些改进使得 P2 的性能达到了与 ERB 和 ERubi 相当的水平,其编译后的代码执行速度比早期版本快一倍以上,证明了 Ruby 本身的高性能潜力。

P2 的成功经验表明,Ruby-to-Ruby 编译技术在提升 DSL 性能方面具有巨大潜力,值得在更多场景下推广应用。

Noteflakes - How I Made Ruby Faster than Ruby
订阅情报