之前,遇到一个奇怪的问题,先上代码
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指令集与操作系统联合引发的。鉴于花在该问题的时间已经超出了其该有的价值,后面就不了了之。