Go语言指针传递与返回性能测试结果反常疑问求助
Go函数参数传递与返回的基准测试异常结果分析
和同事探讨Go语言中向函数传递指针及返回指针是否更高效,为此编写了4组基准测试函数,覆盖四种参数传递与返回方式:
- 传值入参,生成新变量并返回副本
- 传值入参,生成新变量并返回指针
- 传指针入参,生成新变量并返回副本
- 传指针入参,原地修改值无返回
测试代码
package main import ( "fmt" "testing" ) type MyStruct struct { myString string } func acceptParamReturnVariable(s MyStruct) MyStruct { ns := MyStruct{ fmt.Sprintf("I'm quoting this: \"%s\"", s.myString), } return ns } func acceptParamReturnPointer(s MyStruct) *MyStruct { ns := MyStruct{ fmt.Sprintf("I'm quoting this: \"%s\"", s.myString), } return &ns } func acceptPointerParamReturnVariable(s *MyStruct) MyStruct { ns := MyStruct{ fmt.Sprintf("I'm quoting this: \"%s\"", s.myString), } return ns } func acceptPointerParamNoReturn(s *MyStruct) { s.myString = fmt.Sprintf("I'm quoting this: \"%s\"", s.myString) } func BenchmarkNormalParamReturnVariable(b *testing.B) { s := MyStruct{ myString: "Hello World", } var ns MyStruct for i := 0; i < b.N; i++ { ns = acceptParamReturnVariable(s) } _ = ns } func BenchmarkNormalParamReturnPointer(b *testing.B) { s := MyStruct{ myString: "Hello World", } var ns *MyStruct for i := 0; i < b.N; i++ { ns = acceptParamReturnPointer(s) } _ = ns } func BenchmarkPointerParamReturnVariable(b *testing.B) { s := MyStruct{ myString: "Hello World", } var ns MyStruct for i := 0; i < b.N; i++ { ns = acceptPointerParamReturnVariable(&s) } _ = ns } func BenchmarkPointerParamNoReturn(b *testing.B) { s := MyStruct{ myString: "Hello World", } for i := 0; i < b.N; i++ { acceptPointerParamNoReturn(&s) } _ = s }
测试命令与结果
执行基准测试命令:
$ go test -run=XXXX -bench=. -benchmem
测试输出结果:
goos: darwin goarch: amd64 pkg: XXXX cpu: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz BenchmarkNormalParamReturnVariable-16 10538138 103.3 ns/op 48 B/op 2 allocs/op BenchmarkNormalParamReturnPointer-16 9526380 201.2 ns/op 64 B/op 3 allocs/op BenchmarkPointerParamReturnVariable-16 7542066 147.0 ns/op 48 B/op 2 allocs/op BenchmarkPointerParamNoReturn-16 45897 119265 ns/op 924351 B/op 5 allocs/op
疑问
测试前预期传指针入参,原地修改值无返回的方式效率最高,因为函数内无需创建新变量,仅传递内存地址,但实际结果显示该方式耗时最长、内存占用最多,求专业人士解释原因。
内容的提问来源于stack exchange,提问作者SynackSA
相关产品推荐
相关产品推荐

