Rust 比 C 更快吗?

2025 年 6 月 9 日,Reddit 上有人提问:在所有条件相同的情况下,什么会使 Rust 实现的东西比 C 实现的更快?这是个很棒且有趣的问题,因“所有条件相同”的含义难以界定而难以比较语言。以下是一些可论证“相同”但实际不同及对运行时性能影响的方面:

  • 内联汇编:Rust 语言内置内联汇编,C 常将其作为编译器扩展,如以下 Rust 和 C 的rdtsc示例(在rustc 1.87.0clang 20.1.0下的-0优化级别)会生成相同汇编,但不确定这是否算“相同”。链接:https://godbolt.org/z/f7K8cfnx7
  • 相似代码,不同结果:Rust 和 C 对相似代码语义不同,如 Rust 的struct Rust和 C 的struct C,Rust 可重排序字段优化大小,C 则不行。在 C 中可重排序字段得相同大小,Rust 中写#[repr(C)]可得与 C 相同布局。以 Stylo 项目为例,Mozilla 用 C++并行化 Firefox 样式布局两次失败,第三次用 Rust 成功,虽是同一项目但情况不同。对于新手在相同任务下写 Rust 和 C 代码是否更快,以及专家在相同任务下(懂 Rust 不懂 C 或反之)的情况,难以定论。
  • 编译时与运行时:有 Redditor 提问,Rust 很多安全检查是编译时的,不应有运行时影响。如array[0]在 Rust 运行时有边界检查,C 则没有,Rust 可写array.get_unchecked(0)得 C 语义,C 写边界检查也可得 Rust 语义,这些是否算“相同”难以确定,Rust 编译时检查在某些情况下可被优化掉,C 手动写的边界检查也可能被优化掉,从微观看是编译时,从工程角度则不一定。
  • 结论:该问题最重要的是可能性,假设 C 是“最快语言”,Rust 是否有不能做同样事情的固有原因,答案是否定的(忽略内联汇编情况),但通常讨论的是工程、具体项目等众多变量下的情况,难以得出普遍结论。并在 BlueSky 上发布了关于此的帖子。
阅读 20
0 条评论