在Go中使用一些简单的代码时,我注意到使用bool数组而不是int数组(仅使用0/1的值)具有非常显着的加速。
我原本期望它们都能提供相同的性能,因为在机器级别没有本机bool类型,所以我希望编译器生成类似的汇编代码。
由于差异很大,我对这个结果的有效性持怀疑态度。
我正在使用命令“go build filename.go”构建,但我不确定gcc的“-O3”的等效标志是什么。
func funcUsingBool(n int) int {
if n < 1 { return 0 }
notPrime := make([]bool, n+1)
count := 1
for i := 3; i < n; i = i + 2 {
if notPrime[i] { continue }
count++
k := 2 * i
for k <= n {
notPrime[k] = true
k += i
}
}
return count
}
func funcUsingInt(n int) int {
if n < 1 { return 0}
notPrime := make([]int, n+1)
count := 1
for i := 3; i < n; i = i + 2 {
if notPrime[i] == 1 { continue }
count++
k := 2 * i
for k <= n {
notPrime[k] = 1
k += i
}
}
return count
}
答案 0 :(得分:3)
查看程序集输出(go run -gcflags '-S' test.go
)有一些区别:
布尔:
0x0075 00117 (test.go:11) MOVBLZX (AX)(BX*1), DI
0x0079 00121 (test.go:11) TESTB DIB, DIB
INT:
0x0075 00117 (test.go:28) MOVQ (AX)(BX*8), DI
0x0079 00121 (test.go:28) CMPQ DI, $1
字节/ UINT8:
0x0075 00117 (test.go:28) MOVBLZX (AX)(BX*1), DI
0x0079 00121 (test.go:28) CMPB DIB, $1
在Go 1.8上,我的组装其余部分几乎完全相同。*。
所以:1)数据类型大小不同2)操作不同