bool 与 int 数组的性能

two*_*san 1 performance go

在使用 Go 中的一些简单代码时,我注意到使用 bool 数组而不是 int 数组(仅使用 0/1 值)具有相当显着的加速效果。

  • funcUsingBool - 1.397s
  • funcUsingInt - 1.996s

我本来期望它们都能提供相同的性能,因为在机器级别没有本机 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)

Mar*_*her 5

查看汇编输出 ( 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)操作不同