這篇文章將和大家分享Go語言的兩個高效小技巧:這其一是不要使用和fmt.Sprintf操作字串;其二是對於固定字段的鍵值對,用臨時Struct,不要用map[string]interface{}。
操作字串很方便,但是真的很慢,在Go語言裡使用會導致你的程式跑得可能比腳本語言還滿,不相信的可以自己做個測試,用操作,迭代十萬次,Python、Javascript都比Go快很多(是很多噢,不是一點點)
func TestStr(t *testing.T) { str := "" for i := 0; i < 100000; i++ { str += "test" } }
測試結果
PASS: TestStr (3.32s)
str="" for i in range(100000): str+="test"
測試結果:
#~/» time python test.py % cpu 0.078 total作為靜態語言的Go,居然在這麼一個段落簡單的程式碼上執行效率比Python慢了100倍,不可思議吧?不是Go的問題,而是在Go中使用 處理字串是很消耗效能的,而Python應該是對 運算字串進行了重載最佳化。 (Javascript 操作字串也很快)相關教學:
strBuf := bytes.NewBufferString("") for i := 0; i < 100000; i++ { strBuf.WriteString("test") }
func TestStr(t *testing.T) { a, b := "Hello", "world" for i := 0; i < 1000000; i++ { fmt.Sprintf("%s%s", a, b) //strings.Join([]string{a, b}, "") } }
PASS: TestStr (0.09s)從結果來看strings.Join 比用Sprint快4倍左右吧。 2.對於固定欄位的鍵值對,用臨時Struct,不要用map[string]interface{}舉個簡單的例子func TestStr(t *testing.T) { a, b := "Hello", "world" for i := 0; i < 1000000; i++ { //fmt.Sprintf("%s%s", a, b) strings.Join([]string{a, b}, "") } }登入後複製
func TestData(t *testing.T) { for i := 0; i < 100000000; i++ { var a struct { Name string Age int } a.Name = "Hello" a.Age = 10 } }
PASS: TestData2 (38.30s)相差上千倍的效率呢!func TestData2(t *testing.T) { for i := 0; i < 100000000; i++ { var a = map[string]interface{}{} a["Name"] = "Hello" a["Age"] = 10 } }登入後複製在能夠知道欄位的情況下,用臨時Struct在運行期間不需要動態分配內容,而且不需要像map那樣去檢查索引,所以速度會快非常多。
以上是Go語言之兩個高效小技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!