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行左右的代码。
文章作者
上次更新 2023-06-26