CEL与Rust实现接近原生速度的解释执行
这篇文章介绍了在构建Agentgateway时,如何优化嵌入式表达式语言CEL(Common Expression Language)的性能,使其在Rust中达到接近原生代码的执行速度。
背景与需求
- 应用场景:需要一种嵌入式表达式语言让用户在运行时编写自定义逻辑
- 典型用例:
- 提取日志字段(如
request.headers["user-agent"]) - 评估授权条件(如
jwt.sub == "admin" || request.path == "/public") - 操作请求/响应字段
- 提取日志字段(如
- 性能要求:每个请求需要评估数百个表达式,必须足够快速
初始性能问题
使用Rust的CEL实现后,虽然功能完善,但性能存在瓶颈:
- CEL占用10-20%的CPU
- 性能测试结果:
- 基线:60K QPS
- 构建CEL上下文100次:15K QPS
- 评估快速表达式100次:37.2K QPS
- 评估慢速表达式100次:9K QPS
核心性能瓶颈
- 变量物化问题:在每次评估前必须将原生类型(如
http::Request)转换为Value类型,成本极高 - 堆分配开销:所有
Value对象都是堆分配的,克隆成本高 - 哈希查找开销:所有结构都使用哈希映射,每次字段访问约需20ns,嵌套表达式会累积延迟
优化方案:原生类型支持
作者提出的解决方案是允许CEL直接在原生Rust类型上解析字段,无需先转换为Value类型,只在最终结果时才进行转换,从而大幅减少不必要的类型转换和内存分配开销。
https://blog.howardjohn.info/posts/cel-fast/
FORTRAN 到 Rust 转换:第一部分
背景
作者对旅行者号太空探测器的图像处理产生兴趣,想要重新实现其处理流程。旅行者号于1977年发射,代码主要用FORTRAN编写。作者希望使用Rust来重新实现这个系统。
关键问题
- SPICE工具包:NASA的SPICE是一套用于空间几何问题的数据格式、工具和API,主要用FORTRAN 77编写
- 现有解决方案的局限:
- 从Rust调用C API会失去Rust的安全保障
- 可能导致内存损坏和错误结果
- 应用程序分发更复杂,移植性差
- 严重依赖全局状态,完全不支持线程安全
- 某些计算开销很大,无法并发运行
解决方案
作者决定将整个SPICE工具包直接从FORTRAN翻译成纯Rust代码:
- 开发了f2rust:一个FORTRAN编译器,可以生成Rust代码
- 创建了rsspice:50万行纯Rust代码的SPICE工具包移植版本
- 成功通过了完整的SPICE测试套件
FORTRAN 77 介绍
文章介绍了FORTRAN 77的基本语法特点:
- 子程序声明:使用SUBROUTINE定义函数
- 隐式类型:默认情况下,I-N开头的变量是整数,其他是实数(可以用IMPLICIT NONE禁用)
- 数组操作:支持多维数组
- 循环语句:DO循环和语句标签系统
- 代码示例:展示了一个向量加法的简单子程序
https://zaynar.co.uk/posts/f2rust-1/
--
From 日报小组 Mike
社区学习交流平台订阅:
1
共 0 条评论, 1 页
评论区
写评论还没有评论