为什么go基准测试在不同的地方用相同的代码显示不同的结果?

为什么go基准测试在不同的地方用相同的代码显示不同的结果?,go,benchmarking,Go,Benchmarking,我对golang系统包“math/bits”进行了基准测试。它很快。 我对从“math/bits”复制的相同代码进行了基准测试,速度大约慢了3倍 我想知道在编译、链接或基准测试时,用户代码和系统代码之间的区别是什么 //x_test.go 包装x_测试 进口( “数学/比特” “测试” ) //复制自“数学/比特” 常数DeBruijn64=0x03f79d71b4ca8b09 变量输入uint64=DeBruijn64 变量输出整数 常数m0=0x5555//01010101。。。 常数m1=

我对golang系统包“math/bits”进行了基准测试。它很快。 我对从“math/bits”复制的相同代码进行了基准测试,速度大约慢了3倍

我想知道在编译、链接或基准测试时,用户代码和系统代码之间的区别是什么

//x_test.go
包装x_测试
进口(
“数学/比特”
“测试”
)
//复制自“数学/比特”
常数DeBruijn64=0x03f79d71b4ca8b09
变量输入uint64=DeBruijn64
变量输出整数
常数m0=0x5555//01010101。。。
常数m1=0x3333//00110011。。。
常数m2=0x0F0F//00001111。。。
常数m3=0x00ff00ff00ff00ff//等。
常数m4=0x0000ffff0000ffff
func OnesCount64(x uint64)整数{
常数m=11&(m0&m)+x&(m0&m)
x=x>>2&(m1&m)+x&(m1&m)
x=(x>>4+x)和(m2&m)
x+=x>>8
x+=x>>16
x+=x>>32

返回int(x)&(1在深入研究go源代码后,我发现在编译过程中,go用指令实现替换了math/bits:OneScont64:
go/src/cmd/compile/internal/gc/ssa.go:3428:makeOnesCountAMD64

调用
math/bits.onescont64
时,它实际上使用了
math/bits
中的代码

go test x_test.go  -bench=.
goos: darwin
goarch: amd64
BenchmarkMine-4         500000000                3.32 ns/op
BenchmarkGo-4           2000000000               0.96 ns/op