这确实取决于 Go 版本,但 go version go1.7 windows/amd64 似乎确实计算了一次值。
转码:
var cycles = 10.0
var res = 1000.0
for t := 0.0; t < cycles*2*math.Pi; t += res {
}
汇编代码:
movsd [rsp+58h+var_20], xmm0
mov [rsp+58h+var_18], 0
mov [rsp+58h+var_10], 0
lea rax, qword_494500
mov [rsp+58h+var_58], rax
lea rax, [rsp+58h+var_20]
mov [rsp+58h+var_50], rax
mov [rsp+58h+var_48], 0
call runtime_convT2E
mov rax, [rsp+58h+var_40]
mov rcx, [rsp+58h+a] ; a
mov [rsp+58h+var_18], rax
mov [rsp+58h+var_10], rcx
lea rax, [rsp+58h+var_18]
mov [rsp+58h+var_58], rax
mov [rsp+58h+var_50], 1
mov [rsp+58h+var_48], 1
call fmt_Println
movsd xmm0, cs:$f64_408f400000000000
movsd xmm1, [rsp+58h+t]
addsd xmm0, xmm1
movsd [rsp+58h+t], xmm0
movsd xmm1, cs:$f64_404f6a7a2955385e
ucomisd xmm1, xmm0
ja loc_401083
f64_404f6a7a2955385e 是预先计算的双精度值,等于 10 * 2 * math.Pi 或 62.8318530718
Go 编译器 recently switched 到 SSA,因此这些优化将不断改进,因为它们从中受益匪浅。目前 SSA 仅在 amd64 上可用:
编译器工具链
此版本包括用于 64 位 x86 的新代码生成后端
系统,根据 2015 年的一项提案,该提案一直在开发中
自那时候起。新的后端,基于 SSA,生成更紧凑、更
高效的代码并为优化提供更好的平台,例如
边界检查消除。
1.8 should have it for all supported architectures:
编译器工具链
Go 1.7 为 64 位 x86 系统引入了新的编译器后端。在围棋中
1.8,该后端已进一步开发,现在用于所有
架构。