那个过程宏生成多少代码?

主要观点:Rust 的过程宏强大但有技巧性且有编译时成本,本文介绍新工具 -Zmacro-stats 来量化和减少这些成本。
关键信息

  • 过程宏影响编译时间的方式有编译自身时间、依赖的 crate 编译时间、运行过程宏调用时间、编译过程宏生成的代码时间。
  • cargo check输出中“Checking”和“Compiling”行混合,原因是包括过程宏相关的编译。
  • watt可避免部分成本,重点关注过程宏生成代码的成本。
  • cargo-expand可查看宏扩展后的代码,但不太适用大型代码库。
  • -Zmacro-stats是 Rust 编译器的新不稳定标志,可显示过程宏代码大小,有两种使用方式。
  • 展示了简单 Rust 程序和带有各种派生过程宏、属性宏及声明性宏的代码的 -Zmacro-stats 输出。
    重要细节
  • 内置宏生成代码较少,2 到 12 行。derive_more宏类似。serde::Serialize23 行,serde::Deserialize159 行,arbitrary::Arbitrary81 行,且其还引发其他宏调用增加代码量。
  • 一个带有两个字段的小结构体使用tracing宏后有 232 行代码和 20 个辅助宏。
  • 使用 -Zmacro-stats 要根据代码库大小判断是否有用,大型代码库可能有用,小型代码库可能效果不明显,使用时要测量变化是否值得。若某个过程宏占代码量 25%,可避免使用或寻找更便宜的替代方案,如serde-liteminiserde。此工具新,欢迎尝试并提出改进意见。
阅读 10
0 条评论