bool vs int数组的性能

时间:2017-06-30 14:15:29

标签: 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
}

1 个答案:

答案 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)操作不同