大佬们分析一下,为什么这种方式调用函数会慢10倍?

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

考虑用T0是因为希望能写出对gc友好的代码 ```go package main import ( "testing" ) type Response struct { Name string Age int Hobby string } type Request struct { Name string Age int Hobby string } //考虑不用这种的原因是因为变量逃逸了,感觉大量使用这种方式对gc不太好 func Resp1(r *Request) *Response { return &Response{ r.Name, r.Age, r.Name, } } //这种方式没有逃逸,但是为什么速度会变慢?按理说和上面的速度应该是相当的啊。 func Resp0(r *Request, res *Response) { res.Age = r.Age res.Name = r.Name res.Hobby = r.Name } func T0() { resp := Response{} req := Request{Name: "111", Age: 10, Hobby: "code"} Resp0(&req, &resp) if resp.Age == 0 { return } } func T1() { req := Request{Name: "111", Age: 10, Hobby: "code"} resp := Resp1(&req) if resp.Age == 0 { return } } func BenchmarkT0AndT1(b *testing.B) { //BenchmarkT0AndT1/T0-16 519476035 2.229 ns/op 0 B/op 0 allocs/op b.Run("T0", func(b *testing.B) { for i := 0; i < b.N; i++ { T0()//大概慢了10倍,有点不可思议。 } }) //BenchmarkT0AndT1/T1-16 1000000000 0.2679 ns/op 0 B/op 0 allocs/op b.Run("T1", func(b *testing.B) { for i := 0; i < b.N; i++ { T1() //为什么这个会快得多? } }) //结果 //BenchmarkT0AndT1/T0-16 519476035 2.229 ns/op 0 B/op 0 allocs/op //BenchmarkT0AndT1/T1-16 1000000000 0.2679 ns/op 0 B/op 0 allocs/op } ```

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

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

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