mmdr:纯 Rust 实现的超快速 Mermaid 图表渲染器
核心特点
mmdr 是一个纯 Rust 实现的 Mermaid 图表渲染工具,其性能相比官方的 mermaid-cli 快了 500-1000倍,并且完全无需浏览器依赖。
性能对比
| 图表类型 |
mmdr |
mermaid-cli |
加速比 |
| 流程图 |
2.75ms |
2,636ms |
958倍 |
| 类图 |
3.19ms |
2,381ms |
746倍 |
| 状态图 |
2.45ms |
2,647ms |
1,080倍 |
| 时序图 |
2.47ms |
2,444ms |
990倍 |
为什么这么快?
- mermaid-cli: 每次渲染都需要启动 Chromium 浏览器,这带来了 2-3 秒的固定启动开销。
- mmdr: 采用纯 Rust 原生解析和渲染,直接输出 SVG/PNG,不依赖浏览器、Node.js 或 Puppeteer。
实际应用场景对比
- 50 个图表的 CI/CD 流程:使用 mermaid-cli 渲染需要约 2 分钟,而 mmdr 可以在 1 秒内完成。
- 实时编辑器预览:mermaid-cli 会导致明显卡顿,而 mmdr 能够实现即时响应。
安装方式
cargo install --path . # 源码安装
brew install mmdr # macOS/Linux
scoop install mmdr # Windows
yay -S mmdr-bin # Arch Linux
快速使用
echo 'flowchart LR; A-->B-->C' | mmdr -e svg
mmdr -i diagram.mmd -o output.svg -e svg
mmdr -i README.md -o ./diagrams/ -e svg
支持的功能
- 图表类型: 流程图、类图、状态图、时序图。
- 节点形状: 矩形、圆角、菱形、六边形、圆柱等 12 种以上。
- 边样式: 实线、虚线、粗线、带标签、多种箭头装饰。
- 高级特性: 子图、嵌套、样式定制、主题配置。
技术实现
其内部是一个纯 Rust 实现的处理管道:解析 → 中间表示 → 布局(使用 dagre 算法)→ 渲染 SVG → 转换 PNG。
项目地址:https://github.com/1jehuang/mermaid-rs-renderer
Succinctly:基于简洁数据结构的快速 jq/yq 替代工具
一位开发者发布了用 Rust 编写的 Succinctly 项目,这是一个使用简洁数据结构(通过 rank/select 半索引技术)实现 jq 和 yq 功能的库和 CLI 工具。
主要特性
已实现功能:
- 支持大多数 jq 和 yq 查询模式(reduce、limit、recurse、regex、路径函数等)。
- JSON 解析速度约 880 MiB/s,YAML 解析速度约 250-400 MiB/s。
- 支持基于位置的导航功能,可用于 IDE 集成。
尚未实现:
- input/inputs(从标准输入流式处理多个 JSON 值)。
- 超过内存大小的文件流式处理。
- 部分高级 YAML 边缘情况。
性能对比
与 jq 对比(AMD Ryzen 9 7950X 平台):
- 速度提升 1.7-1.8倍。
- 内存使用仅为 jq 的 7-30%(处理 100MB 文件仅用 104MB,而 jq 需要约 1GB)。
与 yq 对比(Apple M1 Max 平台):
- 速度提升 7-10倍。
- 内存使用仅为 yq 的 9-16%(处理 100MB 文件仅用 573MB,而 yq 需要约 6GB)。
技术亮点
- 硬件优化:针对 x86_64 平台使用 AVX2 SIMD、POPCNT、BMI2 指令集;针对 ARM 平台使用 NEON 指令集。
- 简洁数据结构:通过在原始文本上创建轻量级索引,而非构建完整的 DOM 树,实现了 O(1) 复杂度的节点导航,从而将内存占用降低了 6-10 倍。
- 支持
no_std 环境。
该项目已在 GitHub 和 Crates.io 上开源,开发者欢迎来自社区的反馈和 Bug 报告。
相关讨论:https://old.reddit.com/r/rust/comments/1qleizg/succinctly_a_fast_jqyq_alternative_built_on/
jbundle:用 Rust 打包 JVM 应用的命令行工具
项目背景
一位开发者用 Rust 开发了一个名为 jbundle 的工具,旨在解决 Java 生态系统中一个常见的痛点:如何在目标机器上分发 JVM 应用,而无需预先安装 Java 运行时。
解决的问题
- 传统的解决方案是使用 GraalVM native-image 进行 AOT 编译,但这存在诸多问题:
- 反射配置非常复杂。
- 经常遇到第三方库的兼容性问题。
- 编译时间可能超过 10 分钟。
- 因此,大多数开发者最终只能分发 JAR 文件,并附带一句“请安装 Java 21”的说明,用户体验不佳。
解决方案
jbundle 采用了截然不同的思路:
- 它将 JAR 文件和一个通过
jlink 创建的精简版 JVM 运行时,打包成单个自解压的可执行文件。
- 无需进行 AOT 编译,无需配置反射,保持了 100% 的 JVM 兼容性。
- 最终生成一个大小在 30-50 MB 的独立二进制文件。
为什么选择 Rust?
- 速度快:整个打包过程仅需几秒钟。
- 无运行时依赖:生成的是单个静态链接的二进制文件。
- 跨平台:支持 Linux x64/ARM64、macOS x64/ARM64。
技术亮点
- 采用多层二进制格式,并带有内容哈希缓存机制。
- 提供类似 rustc 风格的结构化错误诊断信息。
- 内部使用了 flate2 进行压缩、reqwest 下载 JDK、clap 处理命令行参数。
- 整个项目大约 2500 行 Rust 代码。
项目状态
这个项目展示了 Rust 在构建高效、可靠的开发者工具方面的强大能力。更多类似的实用工具和开源项目讨论,欢迎访问云栈社区的开发者广场板块。
相关讨论:https://old.reddit.com/r/rust/comments/1qm43ge/jbundle_a_rust_cli_to_package_jvm_apps_into/
|