Go代码性能小技巧

Admin 2019-05-06 12:24:03 GoLang

1、字符串+号拼接

+号在拼接字符串上很方便,但性能上确实很慢(+string扩充容量慢),当数量级比较大的时候,性能比Python脚本还慢

package test

import (
    "testing"
)

func TestAdd(t *testing.T) {
    str := ""
    for i := 0; i < 100000; i++ {
        str += "add"
    }
}
# 测试

go test -v -run TestAdd learn_test.go 
=== RUN   TestAdd
--- PASS: TestAdd (4.00s)
PASS
ok      command-line-arguments  4.006s

比较有效的方法是使用buffer

package test

import (
    "testing"
)

func TestBuffer(t *testing.T) {
    buff := bytes.NewBufferString("")
    for i := 0; i < 100000; i++ {
        buff.WriteString("add")
    }
}
# 结果

go test -v -run TestBuffer learn_test.go 
=== RUN   TestBuffer
--- PASS: TestBuffer (0.00s)
PASS
ok      command-line-arguments  0.009s

从结果来看效果还是比较明显的

2、使用fmt.Sprintf()来组合字符串(很多的开源代码都是这么写的,但测试发现fmt也是比较慢的)

package test

import (
    "testing"
    "fmt"
)

func TestFmt(t *testing.T) {
    a, b := "add", "test"
    for i := 0; i < 1000000; i++ {
        fmt.Sprintf("%s%s", a, b)
    }
}
# 结果

go test -v -run TestFmt learn_test.go 
=== RUN   TestFmt
--- PASS: TestFmt (0.25s)
PASS
ok      command-line-arguments  0.255s

使用strings.Join后我们在看下性能

package test

import (
    "testing"
    "strings"
)

func TestJoin(t *testing.T) {
    a, b := "add", "test"
    for i := 0; i < 1000000; i++ {
        strings.Join([]string{a, b}, "")
    }
}
# 结果

go test -v -run TestJoin learn_test.go 
=== RUN   TestJoin
--- PASS: TestJoin (0.06s)
PASS
ok      command-line-arguments  0.070s

从结果来看strings.Join比fmt.Sprint快4倍左右

相关文章
最新推荐