Go-Rust 编译器优化对比
文章目录
Go
release模式 编译为x86-64
我不知道Go除了使用 go build file.go 是否还有其它命令才能真正编译为release模式
 | 
 | 
它生成的汇编是什么样的呢?
 | 
 | 
https://go.godbolt.org/z/79n33vMh8
可以看到Go似乎只使用了普通指令
JMP main_setBit1_pc16 会执行无限循环,直到满足条件JGT main_setBit1_pc103时才退出,也就是cpu会循环15次执行这几条指令。
这实际上不符合预期,这个循环应该可以被编译器优化掉以获得更好的性能。一般来说,CPU需要执行的指令数越少,性能通常会更好。
Rust
等效实现 编译为x86-64:
编译命令 cargo build --release
这是rust默认的release模式,实际上rust默认的release模式比较鸡肋,真正的项目中应该至少加入 lto = true codegen-units = 1两个参数,不过对于这篇文章中的小函数不影响。
 | 
 | 
它生成的汇编为:
 | 
 | 
https://rust.godbolt.org/z/aWKEqvnoP
看起来rust会自动在支持的平台上自动使用部分高级指令,在 x86-64 中默认使用了sse2。把整个循环直接优化掉了,cpu只会执行这40行左右的代码。
文章作者 kk
上次更新 2023-06-26