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)
}
结果
屏幕快照 2016-12-08 下午7.53.23.png
可以看到差别巨大..
分析原因如下:
- string 不可变,每次运算都要分配新的内存把数据拷贝到新的内存中
- byte.Buffer会有预分配, 要合适的时候才会扩大内存,并把原来的数据拷贝过去
网友评论