Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

English Original

性能对比:托管运行时 vs 原生执行

你将学到什么: C# 与 Rust 在真实场景中的性能差异,包括启动时间、内存占用以及 CPU 密集型工作负载。

难度: 中级

团队从 C# 迁移到 Rust 的主要原因通常是性能。尽管 .NET(尤其是 .NET 8)已经取得了惊人的进步,但 Rust 的“零成本抽象”和无垃圾回收器(GC)的设计,在效率和可预测性方面依然更胜一筹。


核心指标一览

指标C# (.NET 8)Rust原因
启动速度~50-200ms~1-5ms无需 JIT 编译,且没有运行时开销。
内存占用~30MB+ (基础)<1MB (基础)无需 GC 堆或大量的元数据存储。
二进制体积~10-50MB~1-5MB静态编译的二进制文件体积更小。
p99 延迟波动的 (GC)极其稳定没有“全线停顿 (Stop the World)”的 GC 暂停。

案例研究:JSON 处理

处理一个 100MB 的 JSON 文件是一项非常普遍的任务。

  • C#:使用 System.Text.Json。虽然经过了高度优化,但在解析过程中依然需要 GC 来清理成千上万个临时创建的字符串和对象。
  • Rust:使用 Serde。由于其强大的生命周期系统,它可以实现“就地解析 (In-place Parsing)”,几乎不需要在解析过程中分配额外的内存。

CPU 密集型任务:Mandelbrot

在并行计算 Mandelbrot 集合(一个常见的 CPU 基准测试)时:

  • C#:表现不错,但如果你不小心,在管理大量线程时可能会遇到 GC 竞争。
  • Rust:使用 Rayon Crate,你可以获得完美的 CPU 扩展性和零成本的数据并行。编译器会确保不会发生数据竞争,让你能够安全地把硬件性能压榨到 100%。

什么时候该留在 C#

Rust 并不总是唯一的答案。在以下情况下,请继续使用 C#:

  1. 开发速度 的优先级高于原始性能。
  2. 你的应用主要是 I/O 密集型(大部分时间在等待数据库或接口响应),且 .NET 的 async/await 已经能很好地处理这些负载。
  3. 你需要开发丰富的 桌面端 UI(如 WPF、WinForms 或 MAUI)。

什么时候该转向 Rust

在以下情况下,请考虑迁移到 Rust:

  1. 你的 C# 性能分析工具显示,应用在 GC 回收上花费了太多时间(即出现了性能瓶颈)。
  2. 你运行在 Serverless 环境(如 AWS Lambda 或 Azure Functions)中,因为更快的冷启动时间直接意味着更少的费用支出。
  3. 你需要在 资源受限 的硬件(如物联网(IoT)或边缘计算设备)上运行。

C# 开发者总结表

  • 可预测性至上:Rust 最大的性能优势并不仅仅是“快”,而是它稳定地快
  • 降低运营成本:Rust 服务通常可以在更小、更便宜的云服务器实例上运行,因为它能节省高达 90% 的 RAM。
  • Native AOT:如果你还没准备好切换到 Rust,可以尝试先开启 .NET 的 Native AOT,看看这是否能解决你的启动速度和内存问题。

练习:运行一个基准测试

挑战:在 C# 中写一个简单的循环计算逻辑,然后用 Rust 重写它。使用 std::time::Instant 来测量两者之间的差异。请观察 Rust 版本中执行耗时和内存占用的极佳表现。

关键理解:Rust 为你提供了 C++ 级别的性能,同时还具备了超越 C# 的安全性(以及通常更好的开发人体工程学)。