⽤ egg 孵化你的 SQL 优化器 - 王润基第三届中国Rust开发者⼤会 ⽤ egg 孵化你的 SQL 优化器 王润基 RisingWave 内核开发⼯程师 ? Parser Binder Optimizer Executor SQL AST Logical Plan Physical Plan Table Catalog Storage RisingLight 查询引擎的整体结构 SELECT name, url 连接重排序 连接算法选择 TopN A Order TopN A Limit 查询优化 定义计划节点 定义重写规则 ⽤纯 Rust 编写的第⼀代优化器 Visitor 模式 ⽤纯 Rust 编写的第⼀代优化器 e-class e-node Rewriting Rewriting (* ?x 2) => (<< ?x 1) Rewriting (* ?x 2) => (join inner true (scan $1 (list $1.1 $1.2)) (scan $2 (list $2.1 $2.2)) ))) 定义语⾔ 构造表达式 2 + x y + * 定义规则:表达式化简 定义规则:算⼦化简 Join Filter A B Join Filter a A B Join A B a & b &0 码力 | 39 页 | 6.48 MB | 1 年前3
KCL: Rust 在编译器领域的实践与探索第三届中国Rust开发者大会 KCL: Rust 在编译器领域的实践与探索 张正 蚂蚁集团 Agenda 01 KusionStack 与 KCL 02 用 Rust 重写 KCL 03 Rust 重写后的收益 04 更多的探索 01 KusionStack 与 KCL KusionStack是什么? KusionStack架构 KCL KusionStack 是什么? Language Server KCL Compiler KCL Package Manager 02 用 Rust 重写 KCL Python 代码翻译 栈式虚拟机 Rust 编译器 KCL 编译器架构升级 Source Code AST LLVM IR Native/WASM Source Code AST Bit code VM Source Code Python Rust 强大的编译检查和错误 处理方式, 更少的 Bug 稳定性提升 端到端编译执行性能提升了 66% 66 % 20 & 40 前端解析器性能提升 20倍 中端语义分析器性能提升40倍 稳定性和性能的巨大提升 50 % 语言编译器编译过程平均内存使用 量变为原来 Python 版本的一半 01 02 03 04 Case1: 单文件编译 > https://github0 码力 | 25 页 | 3.50 MB | 1 年前3
运⾏在浏览器中的 P2P ⽹络 - 李敏成运⾏在浏览器中的 P2P ⽹络 李敏成 from RingsNetwork Montivation 连接所有钱包持有者 去中⼼化的 Pure P2P ⽹络 The Idea 最好的节点载体是浏览器 ⽤户群体 钱包插件 运⾏环境 How to P2P Did: Wallet Address E2E secure(sign/encryption): Wallet Discovery Connect through WebRTC Route by Chord DHT Rings-node browser extension Rings-node daemon 浏览器节点 服务器节点 Node communication Node A Node B Create Offer ConnectNodeSend ConnectNodeReport Pending0 码力 | 23 页 | 1.74 MB | 1 年前3
基于 Rust 语言编写的可编程的全球分布式 MQTT 服务器 王文庭⽤⼀句话描述,那就是Webassembly是执⾏程序的标准化字节码格式 • Webassembly最初被发明,是⽤于Web浏览器。 • 由W3C⼯作组开发的Web浏览器标准,于2017年11⽉, Chrome,Firefox,Microsoft Edge,Safari四⼤浏览器都开始实验性的⽀持 • 它在浏览器以外也有很⼴泛的运⽤,特别是在边缘计算领域。 • ⽀持多语⾔开发,⽐如Go,Python, rust,Javascript等 受限的设备上跑起来; Wasm vs Docker • Kubedge? • OpenYurt? • Krustlet? wasm如何分发部署? 3. HPMQ函数开发说明 HPMQ平台 触发器 公共函数 (⽐如:tb2aws) 私有函数 配置 关联 关联 使⽤流程 编写函数 Hpmqfile OCI镜像 镜像仓库 hpmq-cli build hpmq-cli push0 码力 | 31 页 | 3.95 MB | 1 年前3
Hello 算法 1.1.0 Rust版一方面,难以排除测试环境的干扰因素。硬件配置会影响算法的性能。比如在某台计算机中,算法 A 的运行 时间比算法 B 短;但在另一台配置不同的计算机中,可能得到相反的测试结果。这意味着我们需要在各种机 器上进行测试,统计平均效率,而这是不现实的。 另一方面,展开完整测试非常耗费资源。随着输入数据量的变化,算法会表现出不同的效率。例如,在输入 数据量较小时,算法 A 的运行时间比算法 B 短;而在输 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 普通递归:求和操作是在“归”的过程中执行的,每层返回后都要再执行一次求和操作。 ‧ 尾递归:求和操作是在“递”的过程中执行的,“归”的过程只需层层返回。 图 2‑5 尾递归过程 Tip 请注意,许多编译器或解释器并不支持尾递归优化。例如,Python 默认不支持尾递归优化,因此即 使函数是尾递归形式,仍然可能会遇到栈溢出问题。 3. 递归树 当处理与“分治”相关的算法问题时,递归往往比迭代的思路更加直观、代码更加易读。以“斐波那契数列”0 码力 | 388 页 | 18.50 MB | 1 年前3
Hello 算法 1.0.0 Rust版一方面,难以排除测试环境的干扰因素。硬件配置会影响算法的性能。比如在某台计算机中,算法 A 的运行 时间比算法 B 短;但在另一台配置不同的计算机中,可能得到相反的测试结果。这意味着我们需要在各种机 器上进行测试,统计平均效率,而这是不现实的。 另一方面,展开完整测试非常耗费资源。随着输入数据量的变化,算法会表现出不同的效率。例如,在输入 数据量较小时,算法 A 的运行时间比算法 B 短;而在输 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 普通递归:求和操作是在“归”的过程中执行的,每层返回后都要再执行一次求和操作。 ‧ 尾递归:求和操作是在“递”的过程中执行的,“归”的过程只需层层返回。 图 2‑5 尾递归过程 � 请注意,许多编译器或解释器并不支持尾递归优化。例如,Python 默认不支持尾递归优化, 因此即使函数是尾递归形式,仍然可能会遇到栈溢出问题。 3. 递归树 当处理与“分治”相关的算法问题时,递归往往比迭代的思路更加直观、代码更加易读。以“斐波那契数列”0 码力 | 383 页 | 17.61 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Rust 版图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 普通递归:求和操作是在“归”的过程中执行的,每层返回后都要再执行一次求和操作。 ‧ 尾递归:求和操作是在“递”的过程中执行的,“归”的过程只需层层返回。 图 2‑5 尾递归过程 Tip 请注意,许多编译器或解释器并不支持尾递归优化。例如,Python 默认不支持尾递归优化,因此即 使函数是尾递归形式,仍然可能会遇到栈溢出问题。 3. 递归树 当处理与“分治”相关的算法问题时,递归往往比迭代的思路更加直观、代码更加易读。以“斐波那契数列” time_complexity.rs === /* 平方阶(冒泡排序) */ fn bubble_sort(nums: &mut [i32]) -> i32 { let mut count = 0; // 计数器 // 外循环:未排序区间为 [0, i] for i in (1..nums.len()).rev() { // 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端 for0 码力 | 387 页 | 18.51 MB | 10 月前3
Rust并行编译的挑战与突破相关浅谈 Rust编译速度之殇 编译器设计造成编译速度缓慢 · 单态化 · 借用检查 · 宏展开 · MIR优化 ... Rust规模编译速度慢于C++ Rust编译速度之殇 提升编译效率成为近年社区重点工作 并行编译或成下一代编译效率突破利器 2017-2021,Rust编译速度已提升一倍以上 Rust社区编译器性能工作组 Rust编译器并行化 Cargo多crate并行 二进制生成并行 更多更好的并行化? Rust编译器架构 语法树生成 宏展开 命名解析 泛型解析 类型检查 借用检查 单态化 二进制生成 增量编译系统 底层数据 结构 Rust语言编译器结构总览 考虑内部编译流程并行化 Rust并行并发 编译时线程安全检查 一些常见线程安全数据结构 常用Rust并行并发库 Rust并行并发 增加程序复杂度 线程安全数据结构造成效率损失 Mutex与RwLock profileing成本 ... 收益 > 代价? Rust并行编译的挑战与突破 挑战:消减共享数据结构效率损失 共享数据结构的性能损耗问题 基于条件编译的共享数据结构实现 缺点:用户需自行生成编译器 挑战:消减共享数据结构效率损失 Specailization —— 基于GAT的共享数据结构实现 接口 入口 非共享 数据结构 共享 数据结构 接口 实现 接口 实现 执行结果 同一份代码0 码力 | 25 页 | 4.60 MB | 1 年前3
Comprehensive Rust(简体中文) 20241216.7 HashMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 16.8 练习:计数器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 16.8.1 解答 . . . . . . . 7 Drop 特征 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 19.8 练习:构建器类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 19.8.1 解答 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 VII 第四天:上午 139 24 Welcome to Day 4 140 25 迭代器 141 25.1 Iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 250 码力 | 359 页 | 1.33 MB | 10 月前3
Rust 程序设计语言 简体中文版 1.85.0将错误信息输出到标准错误而不是标准输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 13. 函数式语言特性:迭代器与闭包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 13.2. 使用迭代器处理元素序列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 13.4. 性能比较:循环对迭代器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .0 码力 | 562 页 | 3.23 MB | 25 天前3
共 42 条
- 1
- 2
- 3
- 4
- 5













