浅谈golang 的高效编码细节
xdm ,浅谈我们都晓得 golang 是效编生成的高并发 ,高效的码细编译型言语
可我们也都可晓得 ,对象再好,浅谈用法舛错,效编全都白费,码细我们来举 2 个经常独犷悍路来感应感染一下
struct 和 map 用谁呢?浅谈
筹算劲很小的时辰,大年夜大年夜约看不出独霸 且则 struct 和 map 的效编耗时差距,可是码细数量起来了,差距就较着了,浅谈且会跟着数量越除夜,效编差距愈加现显
当我们碰着键和值都可所以结实的码细时辰 ,我们选择 struct 比 选择 map 的浅谈编制 高效多了
- 我们模仿轮回筹算 1 亿 次,看看独霸各自的效编数据筹划会耗时若干很多若干良多若干很多若干良多若干很多若干
- 轮回前筹算一下往后时分
- 轮回后筹算一下往后时分
- 末尾筹算两个时分的差值 ,此处我们独霸 毫秒为单位
func main() { t1 :=time.Now().UnixNano()/1e6 for i := 0; i < 100000000; i++ { var test struct { Name string hobby string } test.Name = "xiaomotong" test.hobby = "program" } t2 :=time.Now().UnixNano()/1e6 fmt.Println("t2 - t1 == ",码细 t2-t1)}法度圭表类型运转搜检终局 :
# go run main.go
t1 == 1634377149185
t2 == 1634377149221
t2 - t1 == 36
独霸 struct 的编制 ,耗时 36 ms ,大年夜师感应感染这个时分若何?
我们一同来看看独霸 map 的编制吧
func main() { t1 :=time.Now().UnixNano()/1e6 fmt.Println("t1 == ", t1) for i := 0; i < 100000000; i++ { var test = map[string]inte***ce{ }{ } test["name"] = "xiaomotong" test["hobby"] = "program" } t2 :=time.Now().UnixNano()/1e6 fmt.Println("t2 == ", t2) fmt.Println("t2 - t1 == ", t2-t1)}法度圭表类型运转搜检终局:
# go run main.go
t1 == 1634377365927
t2 == 1634377373525
t2 - t1 == 7598
独霸 struct 的编制,耗时 7598 ms
独霸 map 和 独霸 struct 的编制 ,完成一样数据措置,耗时相差 212 倍 , 就这 ,我们往常深化编码的时辰,对上述的场景 ,你会选择哪一种数据筹划呢?
为甚么上述差距会那么除夜,启事是
在我们可以断定字段的气候下 ,我们独霸 且则的 Struct 在运转时代是不须要静态分拨内容的,
可是 map 就不一样 ,map 还要往搜检索引,这一点就特别很是耗时了
字符串若何拼接是好?
工作中编码 xdm 碰着字符串拼接的气候,都是若何完成的呢 ?我们的对象且则供给以下几种 :
- 独霸 + 的编制
- 独霸 fmt.Sprintf() 的编制
- 独霸 strings.Join 的编制
- 独霸 buffer 的编制
看到这里 ,大年夜大年夜约我们各有各的谜底 ,不过我们仍是来实操一遍,看看他们在不异字符串拼接气候下 ,各自的措置耗时若何
用 + 的编制
我们来筹算轮回追加 50 万 次字符串 ,看看耗时若干很多若干良多若干很多若干良多若干很多若干
func main() { t1 := time.Now().UnixNano() / 1e6 fmt.Println("t1 == ", t1) s := "xiao" for i := 0; i < 500000; i++ { s += "motong" } t2 := time.Now().UnixNano() / 1e6 fmt.Println("t2 == ", t2) fmt.Println("t2 - t1 == ", t2-t1)}法度圭表类型运转搜检终局:
# go run main.go
t1 == 1634378595642
t2 == 1634378743119
t2 - t1 == 147477
看到这个数据 xdm 有没有惊呆了,竟然这么慢,耗时 147477 ms 那可是妥妥的 2分27秒呀
Go言语 中独霸+措置字符串是很破钞功用的,经由过程数据我们便可以看出来
独霸 fmt.Sprintf() 的编制
func main() { t1 := time.Now().UnixNano() / 1e6 fmt.Println("t1 == ", t1) s := "xiao" for i := 0; i < 500000; i++ { s = fmt.Sprintf("%s%s",s,"motong") } t2 := time.Now().UnixNano() / 1e6 fmt.Println("t2 == ", t2) fmt.Println("t2 - t1 == ", t2-t1)}法度圭表类型运转搜检终局 :
# go run main.go
t1 == 1634378977361
t2 == 1634379240292
t2 - t1 == 262931
看到这个数据 ,我们也惊呆了,竟然耗时 262931 ms ,算计 4 分 22秒 ,xdm 是不是是没有想到 独霸 fmt.Sprintf 比 独霸 + 还慢
独霸 strings.Join 的编制
func main() { t1 := time.Now().UnixNano() / 1e6 fmt.Println("t1 == ", t1) s := "xiao" for i := 0; i < 500000; i++ { s = strings.Join([]string{ s,"motong"},"") } t2 := time.Now().UnixNano() / 1e6 fmt.Println("t2 == ", t2) fmt.Println("t2 - t1 == ", t2-t1)}法度圭表类型运转搜检终局:
# go run main.go
t1 == 1634379455304
t2 == 1634379598227
t2 - t1 == 142923
耗时 142923 ms ,算计 2 分 22秒 ,和 独霸 +的编制等分春色
独霸 buffer 的编制
独霸 buffer 的编制 理应说是最好的编制,
func main() { t1 := time.Now().UnixNano() / 1e6 fmt.Println("t1 == ", t1) s := bytes.NewBufferString("xiao") for i := 0; i < 500000; i++ { s.WriteString("motong") } t2 := time.Now().UnixNano() / 1e6 fmt.Println("t2 == ", t2) fmt.Println("t2 - t1 == ", t2-t1)}# go run main.go
t1 == 1634378506021
t2 == 1634378506030
t2 - t1 == 9
经由过程上面的数据 ,我们看到 ,拼接一样 50 万次的数据
- 第一种 ,独霸 + 的编制 ,需求 147477 ms
- 第二种 ,独霸 fmt.Sprintf() 的编制,需求 262931 ms
- 第三种,独霸 strings.Join 的编制 ,需求 142923 ms
- 第四种,独霸 buffer 的编制 ,需求 9ms
独霸 buffer 的编制 是 第一种的 16,386 倍 ,是第二种的 29,214 倍 ,是第三种的 15,880 倍
xdm ,假定是碰着上面的场景 ,你会选择独霸哪一种编制呢
到此这篇关于浅谈golang 的高效编码细节的文章就引见到这了,更多相干Go言语 高效编码内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载!
