iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 30
0
自我挑戰組

golang初探系列 第 30

day30-Benchmarks 性能調優

  • 分享至 

  • xImage
  •  

終於來到最後一天,在這個過程當中,發現要寫一篇文章真的不簡單,不僅文章的架構,資源重整等等
看源碼來證實自己的思路是正確,其實花費的時間是需要很多的,但也這樣也讓自己有成長,我很慶幸有參加鐵人賽
本來預期寫的文章是想更多及深入的,基於時間有限和準備不夠充足無法在短時間內準備齊全
若後續有新的觀點依然會進行更新文章,對我來說程式語言就是 keep going 不斷的學習,
這也是我很自傲自己一直堅持努力的地方,在過去未參賽的過程,看開源的 package 都需要花上很多時間去理解,無法像在 php 語言上那麼得心應手,經過這次發現理解速度變快了,這些撞牆過程,其實是蠻享受的,自己期許為來在 golang 發表的文章就朝向底層

Benchmarks

上個章節有提到 性能測試 func 名稱前綴 Benchmark

main.go
package main

import "strings"

//切割字串
//example:
//abc b=>[a c]
func Split(str, sep string) []string {
	var ret []string
	index := strings.Index(str, sep)
	for index > 0 {
		ret = append(ret, str[:index])
		str = str[index+1:]
		index = strings.Index(str, sep)
	}
	return ret
}
main_test.go
package main

import "testing"

func BenchmarkSplit(b *testing.B) {
	for i := 0; i < b.N; i++ {
		Split("a:b:c", ":")
	}
}

使用指令 go test -bench=Split
https://ithelp.ithome.com.tw/upload/images/20200930/20129671gnFPrtSOCi.png
從上圖可以看出

  • goos:linux 為 linux 系統
  • goarch: amd64 為 64 位元
  • BenchmarkSplit-2 指測試 func 名稱為 Split。2 代表為 雙核心
  • 5635024 測試次數
  • 207 ns/op 每次花費時間為 207 ns
    也可以使用 go test -bench=Split -benchmem 查看記憶體分配統計數據
    https://ithelp.ithome.com.tw/upload/images/20200930/20129671B2Du8Ax9oi.png
  • 2 allocs/op 指申請兩次記憶體空間
    因在 append 過程當中申請記憶體,故將代碼修改一下減少申請次數
main.go
package main

import "strings"

//切割字串
//example:
//abc b=>[a c]
func Split(str, sep string) []string {
	var ret = make([]string, 0, strings.Count(str, sep)+1)
	index := strings.Index(str, sep)
	for index > 0 {
		ret = append(ret, str[:index])
		str = str[index+1:]
		index = strings.Index(str, sep)
	}
	return ret
}

再次測試發現申請記憶體次數減少至 1 次
每次花費時間減少至 156 ns/op
https://ithelp.ithome.com.tw/upload/images/20200930/20129671dDwxMW3AuE.png


上一篇
day29- Testing
系列文
golang初探30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言