我有以下代码:
func AddToSliceByValue(mySlice []int) {
for idx := range mySlice {
mySlice[idx]++
}
}
func AddToSliceByPointer(mySlice *[]int) {
for idx := range *mySlice {
(*mySlice)[idx]++
}
}
我的第一个想法是性能应该几乎相同,因为按值传递复制切片标头并按指针传递会迫使我取消引用指针,但我的基准测试显示了其他内容:
func BenchmarkAddByValue(b *testing.B) {
mySlice := rand.Perm(1000)
for n := 0; n < b.N; n++ {
AddToSliceByValue(mySlice)
}
}
func BenchmarkAddByPointer(b *testing.B) {
mySlice := rand.Perm(1000)
for n := 0; n < b.N; n++ {
AddToSliceByPointer(&mySlice)
}
}
基准AddByValue-12 1151256 1035 ns/op
BenchmarkAddByPointer-12 2145110 525 ns/op
谁能向我解释为什么性能差异如此之大?
我还为这两个函数添加了汇编代码。
森林海
qq_花开花谢_0
jeck猫
相关分类