【原】golang slice组成的几种方式性能对比

背景是群里小伙伴写go项目代码,用orm 插入sql,第一步分三条sql、三个slice 插入,建议他一条sql 插入,他找到了批量插入。

但是批量插入需要组成一个切片slice,然后对于这个slice,一个元素不同,其他元素相同,他在想最优雅的解决办法。别人指导了一下 使用指针new 时,

偶尔间我测了下性能,发现差异很多。直接上代码

type User struct {
	ID    int
	Name  string
	Title string
}


func (n *User) New(name string) User {
	n.Name = name
	return *n
}

  

package main

import (
	"testing"
)

//go test -bench=. -benchmem -run=none
func BenchmarkUser_NewBuild(b *testing.B) {
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		user := User{Title: "hee"}
		_ = []User{user.New("2"), user.New("2"), user.New("2")}
		//fmt.Println(users)
	}
}

func BenchmarkUser_Build(b *testing.B) {
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		users := make([]User, 3)
		for i := 0; i < 3; i++ {
			users[i].Name = "2"
			users[i].Title = "hee"
		}
		//fmt.Println(users)
	}
}

func BenchmarkUser_New(b *testing.B) {
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = []User{{Name: "hee", Title: "2"}, {Name: "hee", Title: "2"}, {Name: "hee", Title: "2"}}
	}
}

  

deMacBook-Pro:orm cgy$ go test -bench=. -benchmem -run=none
goos: darwin
goarch: amd64
pkg: go-test/orm
BenchmarkUser_NewBuild-4        336196467                3.50 ns/op            0 B/op          0 allocs/op
BenchmarkUser_Build-4           610977325                2.00 ns/op            0 B/op          0 allocs/op
BenchmarkUser_New-4             1000000000               0.339 ns/op           0 B/op          0 allocs/op
PASS
ok      go-test/orm     3.350s

  可见,直接给定值比设定len快,更比每次动态修改值快多了

posted on 2020-09-21 19:55  studyphp  阅读(456)  评论(0编辑  收藏  举报

导航