美文网首页
Goalng 字符串拼接及其性能

Goalng 字符串拼接及其性能

作者: L白水飘萍 | 来源:发表于2018-11-30 10:41 被阅读0次

(一)加号拼接

这种拼接最简单,也最容易被我们使用,在编程过程我们几乎下意识就是使用+好进行拼接。

func StringPlug() string{
    var s string
    s += "this is string1"
    s += "str2"
    s += "this is string3"
    s += "str4"
    return s
}  

(二)使用fmt

这种拼接,借助于fmt.Sprint系列函数进行拼接,然后返回拼接的字符串。也是一种非常简单的使用方法,这种方法一般是在用不仅限于字符串的一种格式的场景下使用。

func StringFmtSprintf() string {
    return fmt.Sprintf("%s%s%s%s", "this is string1", "str2", "this is string3", "str4")
}

(三)使用Join操作。

这种拼接是用strings.Join()将字符串数组拼接成一个字符串。

func StringJoin() string {
    s := []string{"this is string1", "str2", "this is string3", "str4"}
    return strings.Join(s, "") 
}

(四)用bytes.Buffer拼接

这种被用的也很多,使用的是bytes.Buffer进行的字符串拼接,它是非常灵活的一个结构体,不止可以拼接字符串,还是可以byte,rune等,并且实现了io.Writer接口,写入也非常方便。

func StringBuffer() string {
    var b bytes.Buffer
    b.WriteString("this is string1")
    b.WriteString("str2")
    b.WriteString("this is string3")
    b.WriteString("str4")
    return b.String()
}

(五)用strings.Builder拼接

strings.Builder它的用法几乎和bytsz.Buffer一样。

func StringBuilder() string {
    var b strings.Builder
    b.WriteString("this is string1")
    b.WriteString("str2")
    b.WriteString("this is string3")
    b.WriteString("str4")
    return b.String()
       
}   

(六)性能测试

为了测试几种拼接字符串的方法,我们将上面的函数做一个小小的改变。

func StringPlug2(s []string) string {
    var r string
    l := len(s)
    for i := 0; i < l; i++ {
        r += s[i]
    }
    return r
}   
func StringFmtSprintf2(s []interface{}) string {
    return fmt.Sprint(s...)
}   
func StringJoin2(s []string) string {
    return strings.Join(s, "")
}   
func StringBuffer2(s []string) string {
    var b bytes.Buffer
    l := len(s)
    for i := 0; i < l; i++ {
        b.WriteString(s[i])
    }
    
    return b.String()
}   
    
func StringBuilder2(s []string) string {
    var b strings.Builder
    l := len(s)
    for i := 0; i < l; i++ {
        b.WriteString(s[i])
    }
    return b.String()
}   

测试函数如下:

const NUM = 1000
var Str string = "this is a long string"
        
func GetString(n int) []string {
    s := make([]string, n)
    for i := 0; i < n; i++ { 
        s[i] = Str
    }
   
    return s
} 
func BenchmarkStringPlus2(b *testing.B) {
    s := GetString(NUM)
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        StringPlug2(s)
    }
}  
func BenchmarkFmtSprintf2(b *testing.B) {
    s := GetString(NUM)
    b.ResetTimer()
    in := make([]interface{}, len(s))
    for k, v := range s {
        in[k] = v
    }
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        StringFmtSprintf2(in)
    }
}  
   
func BenchmarkJoin2(b *testing.B) {
    s := GetString(NUM)
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        StringJoin2(s)
    }
}  
func BenchmarkBuffer2(b *testing.B) {
    s := GetString(NUM)
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        StringBuffer2(s)
    }
}  
func BenchmarkBuilder2(b *testing.B) {
    s := GetString(NUM)
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        StringBuilder2(s)
    }
}  

测试结果

goos: linux
goarch: amd64
pkg: gowork/stringjoin
BenchmarkStringPlus2-2           500       2361492 ns/op    11050656 B/op        999 allocs/op
BenchmarkFmtSprintf2-2         30000         43713 ns/op       21767 B/op          1 allocs/op
BenchmarkJoin2-2              100000         20244 ns/op       43520 B/op          2 allocs/op
BenchmarkBuffer2-2             50000         25620 ns/op       66320 B/op         10 allocs/op
BenchmarkBuilder2-2            30000         39369 ns/op       96224 B/op         16 allocs/op

从上面可以看出来性能最好的就是strings.join函数,不过这种一般针对的是字符串数组,很多场景都不适合。我们可以退而求其次采用byts.Buffer 它的运行时间和分配的内存此时都是比较好的。

相关文章

  • Goalng 字符串拼接及其性能

    (一)加号拼接 这种拼接最简单,也最容易被我们使用,在编程过程我们几乎下意识就是使用+好进行拼接。 (二)使用fm...

  • 日志、字符串拼接

    关于字符串拼接效率: 单词调用字符串拼接性能 + > strings.Join > bytes.Buffer > ...

  • go语言string之Buffer与Builder

    操作字符串离不开字符串的拼接,但是Go中string是只读类型,大量字符串的拼接会造成性能问题。 字符串拼接的方式...

  • 字符串

    一、字符串格式化 String.format()的使用 二、字符串拼接 字符串拼接性能比较 三、日志打印效率 使用...

  • C# string 拼接操作性能测试

    一、C# 拼接字符串的几种方式和性能 对于少量固定的字符串拼接,如string s= "a" + "b" + "c...

  • StringBuilder性能优化

    在String字符串拼接性能优化博客中我已经介绍过了String "+" 拼接背后的StringBuilder实现...

  • golang 几种字符串的连接方式

    最近在做性能优化,有个函数里面的耗时特别长,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang ...

  • 同事如此使用StringBuilder,我给他提了一个Bug

    字符串的拼接在项目中使用的非常频繁,但稍不留意往往又会造成一些性能问题。 字符串的拼接在项目中使用的非常频繁,但稍...

  • Java-07 StringBuilder、异常

    StringBuilder 在进行大量字符串改动时(比如拼接、替换),使用String会非常消耗内存,降低程序性能...

  • JDBC:预编译Statement

    使用PreparedStatement 可以设置参数,不用字符串拼接,简化书写 有预编译机制,性能比Stateme...

网友评论

      本文标题:Goalng 字符串拼接及其性能

      本文链接:https://www.haomeiwen.com/subject/fbvccqtx.html