go 字符串拼接性能比較

比較fmt.Sprintf strings.Join + 重復(fù)申明bytes.Buffer 一次申明bytes.Buffer

package main

import (
    "testing"
    "strings"
    "bytes"
    "fmt"
)

var (
    s = "我的加載中國號多少空間哈市的付款計劃的時間恢復(fù)健咖啡哈市的飯卡號發(fā)空間按多少宇航員"
    sub = "宇航員"
    //s = "abcdrfghidhsdh2jkhsdkjfs"
    //sub = "2j"
    _s = []string{s,"[",sub,"]"}
    buf = bytes.Buffer{}
)

//fmt.Sprintf
func BenchmarkS(b *testing.B) {
    b.ReportAllocs()
    for i:=0;i<b.N;i++ {
        fmt.Sprintf("%s[%s]",s,sub)
    }
}

//strings.Join
func BenchmarkJ(b *testing.B) {
    b.ReportAllocs()
    for i:=0;i<b.N;i++ {
        strings.Join(_s,"")
    }
}

//+
func BenchmarkSJ(b *testing.B) {
    b.ReportAllocs()
    for i:=0;i<b.N;i++ {
        _ =s + "[" + sub+"]"
    }
}

//每次申明一個buffer
func BenchmarkBF(b *testing.B) {
    b.ReportAllocs()
    for i:=0;i<b.N;i++ {
        b := bytes.Buffer{}
        b.WriteString(s)
        b.WriteString("[")
        b.WriteString(sub)
        b.WriteString("]")
        b.String()
    }
}

//只聲明一次,每次重置
func BenchmarkBFN(b *testing.B) {
    b.ReportAllocs()
    for i:=0;i<b.N;i++ {
        buf.Reset()
        buf.WriteString(s)
        buf.WriteString("[")
        buf.WriteString(sub)
        buf.WriteString("]")
        buf.String()
    }
}

性能

goos: linux
goarch: amd64
BenchmarkS-8        5000000      368 ns/op    176 B/op     3 allocs/op  //fmt.Sprintf
BenchmarkJ-8        5000000      250 ns/op    288 B/op     2 allocs/op  //strings.Join
BenchmarkSJ-8      10000000      152 ns/op    144 B/op     1 allocs/op  //+
BenchmarkBF-8       2000000      707 ns/op    640 B/op     4 allocs/op  //每次申明一個buffer
BenchmarkBFN-8     10000000      164 ns/op    144 B/op     1 allocs/op  //只聲明一次buffer,每次重置
PASS


結(jié)論:如果字符串少的情況下,綜合耗時,使用內(nèi)存,對象分配,操作便利性方面,+更勝一籌

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容