为什么Rust cargo在release模式会比debug模式快很多?

为什么Rust cargo在release模式会比debug模式快很多?

gpt给了一个笼统的答案,我们用矩阵乘法的例子来看看这里边的差异:
d81120987166e1c7c6a82568bbf01365.jpg

  1. debug模式中会有precondition check(图2)对程序可能的错误进行检测,这占据了其大部分运行时间,而图3 release模式下没有检查,方法栈也更少。
    9833001801fef0e96db9026634d06702.jpg
    1d50cedd20ae270b039d8888f9956136.jpg

  2. release模式会使用SIMD,相比图4 debug模式,图5 release模式用了intel SSE指令集中的mmx寄存器。
    148fcf536a6c36f725e00b83099df487.jpg
    79cf43362331591d829763ed1c6a1e91.jpg

  3. 实际执行指令更少,图5 release模式循环内指令数比图4 release更少。同时debug模式运行9.6s,CPI 0.289,3GHz速度(图6),指令数为 9.63g/0.289,图7 release模式指令数0.32.2g/0.331,指令数更少,这里有condition check和循环优化的多重功劳。
    531a7d4a5291c1c185ff0d9a6a2a3d3f.jpg
    38337aea3b3ccce940bbeb282d2fb49c.jpg

不过,release模式的rust在运行时间上仍与O3优化后的C程序有差距。Rust的一个劣势在于,在运行过程中调用了一些syscall(图8黄条部分),而C程序除了在linux程序初始化下有与系统交互的libc_start_main函数,其他情况下均在用户态上执行(图9)。
9f51cdd34ede5076dc72978593cd64c7.jpg
c1b7cedfb2b44cb28e488745f716b5b5.jpg