Go学习:字符串拼接效率最高执行最快的方式是strings.Join()

以一条实际的业务日志为示例,对比了不同拼接方式的执行效率。

结论:

  1. 无论待拼接的字符串数量多少strings.Join始终是最快的。
  2. 当待拼接的字符串数量多于两个时“+”是效率最低的。
  3. 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
发布了51 篇原创文章 · 获赞 3 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/pengpengzhou/article/details/105100498