以一条实际的业务日志为示例,对比了不同拼接方式的执行效率。
结论:
- 无论待拼接的字符串数量多少strings.Join始终是最快的。
- 当待拼接的字符串数量多于两个时“+”是效率最低的。
- strings.Join快的原因是先计算了所有待拼接字符串的总长度,然后一次性分配内存。
测试1:两个字符串的拼接
package main
import (
"bytes"
"fmt"
"strings"
"time"
)
const N = 100000
func test(f func(), desc string) {
now := time.Now()
for i := 0; i < N; i++ {
f()
}
fmt.Printf(desc, time.Now().Sub(now))
}
func main() {
test(test0, "+ elapse:%v\n")
test(test1, "Buffer elapse:%v\n")
test(test2, "Sprintf elapse:%v\n")
test(test3, "Builder elapse:%v\n")
test(test4, "Join elapse:%v\n")
}
func test0() {
arr := "410001"
arr += "1585065600"
}
func test1() {
var buffer bytes.Buffer
buffer.WriteString("410001")
buffer.WriteString("1585065600")
buffer.String()
}
func test2() {
fmt.Sprintf("%s%s\n",
"410001",
"1585065600")
}
func test3() {
var builder strings.Builder
builder.WriteString("410001")
builder.WriteString("1585065600")
builder.String()
}
func test4() {
arr := make([]string, 2)
arr[0] = "410001"
arr[1] = "1585065600"
strings.Join(arr, "")
}
[root@dev] go run stringconcat2.go
+ elapse:9.744669ms
Buffer elapse:8.131435ms
Sprintf elapse:15.001969ms
Builder elapse:9.810669ms
Join elapse:4.861182ms
测试2:多个字符串的拼接
package main
import (
"bytes"
"fmt"
"strings"
"time"
)
const N = 100000
func test(f func(), desc string) {
now := time.Now()
for i := 0; i < N; i++ {
f()
}
fmt.Printf(desc, time.Now().Sub(now))
}
func main() {
test(test0, "+ elapse:%v\n")
test(test1, "Buffer elapse:%v\n")
test(test2, "Sprintf elapse:%v\n")
test(test3, "Builder elapse:%v\n")
test(test4, "Join elapse:%v\n")
}
func test0() {
arr := "410001"
arr += ","
arr += "1585065600"
arr += ","
arr += "39.128.38.158"
arr += ","
arr += "88E62849B448"
arr += ","
arr += "b89d8210-6de5-11ea-90d5-cd6123395176"
arr += ","
arr += "aphone"
arr += ","
arr += "681ef062d4dc4f412fd50d9f9d4aa8cde5f87e23b15f9d73499e65a9fb3f3d2d"
arr += ","
arr += "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
arr += "\n"
}
func test1() {
var buffer bytes.Buffer
buffer.WriteString("410001")
buffer.WriteString(",")
buffer.WriteString("1585065600")
buffer.WriteString(",")
buffer.WriteString("39.128.38.158")
buffer.WriteString(",")
buffer.WriteString("88E62849B448")
buffer.WriteString(",")
buffer.WriteString("b89d8210-6de5-11ea-90d5-cd6123395176")
buffer.WriteString(",")
buffer.WriteString("aphone")
buffer.WriteString(",")
buffer.WriteString("681ef062d4dc4f412fd50d9f9d4aa8cde5f87e23b15f9d73499e65a9fb3f3d2d")
buffer.WriteString(",")
buffer.WriteString("Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
buffer.WriteString("\n")
buffer.String()
}
func test2() {
fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s,%s\n",
"410001",
"1585065600",
"39.128.38.158",
"88E62849B448",
"b89d8210-6de5-11ea-90d5-cd6123395176",
"aphone",
"681ef062d4dc4f412fd50d9f9d4aa8cde5f87e23b15f9d73499e65a9fb3f3d2d",
"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
"\n")
}
func test3() {
var builder strings.Builder
builder.WriteString("410001")
builder.WriteString(",")
builder.WriteString("1585065600")
builder.WriteString(",")
builder.WriteString("39.128.38.158")
builder.WriteString(",")
builder.WriteString("88E62849B448")
builder.WriteString(",")
builder.WriteString("b89d8210-6de5-11ea-90d5-cd6123395176")
builder.WriteString(",")
builder.WriteString("aphone")
builder.WriteString(",")
builder.WriteString("681ef062d4dc4f412fd50d9f9d4aa8cde5f87e23b15f9d73499e65a9fb3f3d2d")
builder.WriteString(",")
builder.WriteString("Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
builder.WriteString("\n")
builder.String()
}
func test4() {
arr := make([]string, 9)
arr[0] = "410001"
arr[1] = "1585065600"
arr[2] = "39.128.38.158"
arr[3] = "88E62849B448"
arr[4] = "b89d8210-6de5-11ea-90d5-cd6123395176"
arr[5] = "aphone"
arr[6] = "681ef062d4dc4f412fd50d9f9d4aa8cde5f87e23b15f9d73499e65a9fb3f3d2d"
arr[7] = "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
arr[8] = "\n"
strings.Join(arr, ",")
}
[root@dev ] go run stringconcat.go
+ elapse:112.126321ms
Buffer elapse:61.97256ms
Sprintf elapse:52.124233ms
Builder elapse:30.873388ms
Join elapse:24.102687ms