package main
import (
"bytes"
"fmt"
"time"
)
const num = 100000 * 5
func testString() (t int64) {
var s string
start := time.Now().UnixNano()
for i := 0; i < num; i++ {
s += "a"
}
return time.Now().UnixNano() - start
}
func testBuf() (t int64) {
var s bytes.Buffer
start := time.Now().UnixNano()
for i := 0; i < num; i++ {
s.WriteString("a")
}
return time.Now().UnixNano() - start
}
func main() {
fmt.Printf("string ----->%d ms\n", testString()/1e6)
fmt.Printf("buffer ----->%d ms\n", testBuf()/1e6)
}
結(jié)果
屏幕快照 2016-12-08 下午7.53.23.png
可以看到差別巨大..
分析原因如下:
- string 不可變锈死,每次運(yùn)算都要分配新的內(nèi)存把數(shù)據(jù)拷貝到新的內(nèi)存中
- byte.Buffer會(huì)有預(yù)分配, 要合適的時(shí)候才會(huì)擴(kuò)大內(nèi)存躺孝,并把原來的數(shù)據(jù)拷貝過去