主要观点:Rust 的过程宏强大但有技巧性且有编译时成本,本文介绍新工具 -Zmacro-stats 来量化和减少这些成本。
关键信息:
- 过程宏影响编译时间的方式有编译自身时间、依赖的 crate 编译时间、运行过程宏调用时间、编译过程宏生成的代码时间。
cargo check
输出中“Checking”和“Compiling”行混合,原因是包括过程宏相关的编译。watt
可避免部分成本,重点关注过程宏生成代码的成本。cargo-expand
可查看宏扩展后的代码,但不太适用大型代码库。-Zmacro-stats
是 Rust 编译器的新不稳定标志,可显示过程宏代码大小,有两种使用方式。- 展示了简单 Rust 程序和带有各种派生过程宏、属性宏及声明性宏的代码的 -Zmacro-stats 输出。
重要细节: - 内置宏生成代码较少,2 到 12 行。
derive_more
宏类似。serde::Serialize
23 行,serde::Deserialize
159 行,arbitrary::Arbitrary
81 行,且其还引发其他宏调用增加代码量。 - 一个带有两个字段的小结构体使用
tracing
宏后有 232 行代码和 20 个辅助宏。 - 使用 -Zmacro-stats 要根据代码库大小判断是否有用,大型代码库可能有用,小型代码库可能效果不明显,使用时要测量变化是否值得。若某个过程宏占代码量 25%,可避免使用或寻找更便宜的替代方案,如
serde-lite
或miniserde
。此工具新,欢迎尝试并提出改进意见。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。