泛型性能测试

buguang01 · 2023-06-05 17:16:18 · 1255 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-06-05 17:16:18 的主题,其中的信息可能已经有所发展或是发生改变。

type Prop[T any] struct {
    val T
}

type PropI[T Ivalue] struct {
    val T
}

func (this *PropI[T]) GetDataS() string {
    return this.val.GetData()
}

type PropV struct {
    val any
}

type PropIV struct {
    val Ivalue
}

type PropValue struct {
    val *value
}
type value struct {
    data string
}

func (this *value) GetData() string {
    return this.data
}

type Ivalue interface {
    GetData() string
}

func BenchmarkPropValue(b *testing.B) {
    for i := 0; i < b.N; i++ {
        a := new(PropValue)
        a.val = &value{"data"}
        a.val.GetData()
    }
}

func BenchmarkPropIvalue(b *testing.B) {
    for i := 0; i < b.N; i++ {
        a := new(PropIV)
        a.val = &value{"data"}
        var b = a.val
        _ = b
        b.GetData()
        // fmt.Println(b)
    }
}

func BenchmarkPropVByInterface(b *testing.B) {
    for i := 0; i < b.N; i++ {
        a := new(PropV)
        a.val = &value{"data"}
        var b = a.val.(Ivalue)
        _ = b
        b.GetData()
        // fmt.Println(b)
    }
}

func BenchmarkPropTByInterface(b *testing.B) {
    for i := 0; i < b.N; i++ {
        a := new(Prop[Ivalue])
        a.val = &value{"data"}
        var b Ivalue = a.val
        _ = b
        b.GetData()
        // fmt.Println(b)
    }
}
func BenchmarkPropTByIValue(b *testing.B) {
    for i := 0; i < b.N; i++ {
        a := new(PropI[*value])
        a.val = &value{"data"}
        a.val.GetData()
    }
}

func BenchmarkPropTByIValueFunc(b *testing.B) {
    for i := 0; i < b.N; i++ {
        a := new(PropI[*value])
        a.val = &value{"data"}
        a.GetDataS()
    }
}

func BenchmarkPropTByValue(b *testing.B) {
    for i := 0; i < b.N; i++ {
        a := new(Prop[*value])
        a.val = &value{"data"}
        var b *value = a.val
        _ = b
        b.GetData()
    }
}

func BenchmarkPropTByint32(b *testing.B) {
    for i := 0; i < b.N; i++ {
        a := new(Prop[int32])
        a.val = 11
        var b int32 = a.val
        _ = b
    }
}

func BenchmarkPropVByint32(b *testing.B) {
    for i := 0; i < b.N; i++ {
        a := new(PropV)
        a.val = int32(11)
        var b int32 = a.val.(int32)
        _ = b
    }
}

测试结果:

BenchmarkPropValue-12                51983382            22.12 ns/op          16 B/op           1 allocs/op
BenchmarkPropIvalue-12               52064125            22.96 ns/op          16 B/op           1 allocs/op
BenchmarkPropVByInterface-12         35158447            34.03 ns/op          16 B/op           1 allocs/op
BenchmarkPropTByInterface-12         41340108            24.72 ns/op          16 B/op           1 allocs/op
BenchmarkPropTByIValue-12            53881003            22.29 ns/op          16 B/op           1 allocs/op
BenchmarkPropTByIValueFunc-12        53747065            23.84 ns/op          16 B/op           1 allocs/op
BenchmarkPropTByValue-12             54542726            22.27 ns/op          16 B/op           1 allocs/op
BenchmarkPropTByint32-12             1000000000             0.2349 ns/op           0 B/op           0 allocs/op
BenchmarkPropVByint32-12             1000000000             0.2334 ns/op           0 B/op           0 allocs/op

结论:

golang的泛型的性能与写实际类型的性能是一样的。这样比我们有时候把成员写成interface性能要高。


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

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

1255 次点击  ∙  1 赞  
加入收藏 微博
2 回复  |  直到 2023-06-06 08:55:44
lxzan
lxzan · #1 · 2年之前

泛型的性能比写实际类型的性能稍微差点, 你可以写两个快排试试

jan-bar
jan-bar · #2 · 2年之前

泛型是编译时你用了什么类型就生成对应类型的全套代码(因为泛型你指定了类型而不像interface运行时推断),因此性能降的不多,唯一下降的是编译时生成的代码没有你来优化而已。rust也是编译时生成泛型代码。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传