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

liubaorui · 2022-04-21 12:16:28 · 1895 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2022-04-21 12:16:28 的文章,其中的信息可能已经有所发展或是发生改变。

考虑用T0是因为希望能写出对gc友好的代码

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

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