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倍左右
