相信你們在實際的項目開發中會遇到這麼一個事,有的程序員寫的代碼不只bug少,並且性能高;而有的程序員寫的代碼可否流暢的跑起來,都是一個很大問題。
而咱們今天要討論的就是一個關於性能優化的案例分析。程序員
咱們先來構造一些基礎數據(長度爲10億的切片,並賦上值):windows
var testData = GenerateData() // generate billion slice data func GenerateData() []int { data := make([]int, 1000000000) for key, _ := range data { data[key] = key % 128 } return data } // get length func GetDataLen() int { return len(testData) }
// case one func CaseSumOne(result *int) { data := GenerateData() for i := 0; i < GetDataLen(); i++ { *result += data[i] } }
// case two func CaseSumTwo(result *int) { data := GenerateData() dataLen := GetDataLen() for i := 0; i < dataLen; i++ { *result += data[i] } }
$ go test -bench=. goos: windows goarch: amd64 BenchmarkCaseSumOne-8 1 7439749000 ns/op BenchmarkCaseSumTwo-8 1 2529266700 ns/op PASS ok _/C_/go-code/perform/case-one 14.059s
// case three func CaseSumThree(result *int) { data := GenerateData() dataLen := GetDataLen() tmp := *result for i:= 0; i < dataLen; i++ { tmp += data[i] } *result = tmp }
$ go test -bench=. goos: windows goarch: amd64 BenchmarkCaseSumOne-8 1 7439749000 ns/op BenchmarkCaseSumTwo-8 1 2529266700 ns/op BenchmarkCaseSumThree-8 1 1657554600 ns/op PASS ok _/C_/go-code/perform/case-one 15.717s