在使用 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
}
Run Code Online (Sandbox Code Playgroud)
查看汇编输出 ( go run -gcflags '-S' test.go) 有一些差异:
布尔:
0x0075 00117 (test.go:11) MOVBLZX (AX)(BX*1), DI
0x0079 00121 (test.go:11) TESTB DIB, DIB
Run Code Online (Sandbox Code Playgroud)
整数:
0x0075 00117 (test.go:28) MOVQ (AX)(BX*8), DI
0x0079 00121 (test.go:28) CMPQ DI, $1
Run Code Online (Sandbox Code Playgroud)
字节/uint8:
0x0075 00117 (test.go:28) MOVBLZX (AX)(BX*1), DI
0x0079 00121 (test.go:28) CMPB DIB, $1
Run Code Online (Sandbox Code Playgroud)
程序集的其余部分对我来说在 Go 1.8.* 上几乎相同。
所以:1)数据类型大小不同2)操作不同
| 归档时间: |
|
| 查看次数: |
2577 次 |
| 最近记录: |