【Rust日报】 CEL与Rust实现接近原生速度的解释执行

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

核心性能瓶颈

  1. 变量物化问题 :在每次评估前必须将原生类型(如http::Request)转换为Value类型,成本极高

  2. 堆分配开销 :所有Value对象都是堆分配的,克隆成本高

  3. 哈希查找开销:所有结构都使用哈希映射,每次字段访问约需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

社区学习交流平台订阅:

  • Rustcc论坛: 支持rss

  • 微信公众号:Rust语言中文社区

相关推荐
量化分析码农18 分钟前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端
熊猫钓鱼>_>38 分钟前
普通用户视角的端侧智能体验手记【鸿蒙心迹】
开发语言·人工智能·华为·智能手机·性能优化·ai编程·harmonyos
瑞雪兆丰年兮39 分钟前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
程序员cxuan1 小时前
讲真,智能路由这事儿,还得看基元律动
人工智能·后端·程序员
vaskilab2 小时前
Schema 全绿,Agent 却把参数编造了
后端
Java与AI落地2 小时前
Spring AI 上手:给现有 Java 服务加一个能用的 AI 接口
后端
Swot2 小时前
SvelteKit 数据流研究:`+page.js` 和 `+page.server.js` 到底谁在跑,数据又去了哪儿
前端·后端
一条Go2 小时前
历史告警归档:为什么"删掉主库行"是最后一步
后端·架构·github
nice_lcj5202 小时前
【从零理解 Spring AI · 16】Agent 与工作流:什么该写死,什么该让模型决定
java·人工智能·后端·spring ai·ai应用开发
梦醒江南2 小时前
Agent 调工具报 504 之后:测试如何设计网络抖动下的幂等与补偿验证?
后端·agent·ai编程