golang 关于bool一个奇怪的问题

laomaozi · · 1274 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

之前,遇到一个奇怪的问题,先上代码


type BoolStruct struct {
    b1 bool
    b2 bool
    b3 bool
    b4 bool
    b5 bool
    b6 bool
    b7 bool
    b8 bool
}

func (bs *BoolStruct) DoSomething() {
    DoSomethingForBool(
        bs.b1,
        bs.b2,
        bs.b3,
        bs.b4,
        bs.b5,
        bs.b6,
        bs.b7,
        bs.b8)
}

func DoSomethingForBool(
    b1 bool,
    b2 bool,
    b3 bool,
    b4 bool,
    b5 bool,
    b6 bool,
    b7 bool,
    b8 bool) byte {
    var b byte

    if b1 {
        //do something
        b++
    }
    if b2 {
        //do something
        b++
    }
    if b3 {
        //do something
        b++
    }
    if b4 {
        //do something
        b++
    }
    if b5 {
        //do something
        b++
    }
    if b6 {
        //do something
        b++
    }
    if b7 {
        //do something
        b++
    }
    if b8 {
        //do something
        b++
    }

    return b
}

var bsFalse = BoolStruct{
    b1: false,
    b2: false,
    b3: false,
    b4: false,
    b5: false,
    b6: false,
    b7: false,
    b8: false,
}

var bsTrue = BoolStruct{
    b1: true,
    b2: true,
    b3: true,
    b4: true,
    b5: true,
    b6: true,
    b7: true,
    b8: true,
}

//go test -bench=. -benchtime=3s -benchmem -run=none

func BenchmarkBSTrue(b *testing.B) {
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        bsTrue.DoSomething()
    }
}
func BenchmarkBSFalse(b *testing.B) {
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        bsFalse.DoSomething()
    }
}

BenchmarkBSTrue-6 1000000000 2.20 ns/op 0 B/op 0 allocs/op
BenchmarkBSFalse-6 1000000000 7.39 ns/op 0 B/op 0 allocs/op

DoSomethingForBool里面,bool=false应该是执行更快才对,但是结果却相反。

一开始我怀疑是内存对齐问题或者是寄存器缓存问题

所以我索性将成员bool个数逐步增加到1000个,测试结果却是一致的。

后来我怀疑是不是Benchmark做什么特殊处理

所以就编译成了执行文件进行测试,结果也是一致。

那会不会是操作系统的问题呢?

我在linux,windows,mac上面,用相同版本都测试了一遍,结果还是一样。

难道go作者特别对bool=true做了特别优化处理?

没道理啊,可以对bool=true优化,也能对bool=false优化的。

后面由于时间关系,没有再关心这个问题,只能猜测是不是cpu指令集与操作系统联合引发的。鉴于花在该问题的时间已经超出了其该有的价值,后面就不了了之。

前几天又突然想起,有知道朋友的请留言告知,不胜感激。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:laomaozi

查看原文:golang 关于bool一个奇怪的问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1274 次点击  
加入收藏 微博
2 回复  |  直到 2020-08-19 10:53:50
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传