Go 性能分析之案例一

思考

相信你們在實際的項目開發中會遇到這麼一個事,有的程序員寫的代碼不只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

問題分析

  • CaseSumTwo執行效率是CaseSumOne的2.94倍,快了近三倍,這是爲何呢?
  • 其實很容易猜到,這裏有一個連續的函數調用「GetDataLen()」,

案例二

// 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

待續

相關文章
相關標籤/搜索