string 和byte.Buffer的巨大差别

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会有预分配, 要合适的时候才会扩大内存,并把原来的数据拷贝过去

你可能感兴趣的:(string 和byte.Buffer的巨大差别)