泛型在 Rust 里是零运行时开销的,代价记在编译期:每个具体类型一份代码。这篇不空谈「代码膨胀」,而是真的数符号、量 .o 文件大小、量编译时间,并和 &dyn 版本对比 —— 结果比「泛型一定更大」要微妙。
describe 在 8 种类型上使用,汇编里生成的 describe 函数符号:8 个
__RINvCs4bCzEYfDy3k_4u40a8describeReEB2_
__RINvCs4bCzEYfDy3k_4u40a8describecEB2_
__RINvCs4bCzEYfDy3k_4u40a8describedEB2_
__RINvCs4bCzEYfDy3k_4u40a8describefEB2_
__RINvCs4bCzEYfDy3k_4u40a8describehEB2_
__RINvCs4bCzEYfDy3k_4u40a8describelEB2_
__RINvCs4bCzEYfDy3k_4u40a8describesEB2_
__RINvCs4bCzEYfDy3k_4u40a8describexEB2_ 不同类型数 泛型版 .o 字节 &dyn 版 .o 字节
1 2,568 6,248
2 4,528 6,712
4 6,608 7,736
8 9,792 9,120.o 文件大小是粗略指标(包含符号表、元数据等),不等于最终可执行文件里的代码段大小。
泛型版 1 种类型:45 ms;泛型版 8 种类型:84 ms;&dyn 版 8 种类型:66 ms
更多关于编译时间与二进制体积的分析见编译时间分析与二进制体积分析;分发方式的运行时对比见静态分发与动态分发性能对比。