分享两个在开发中需注意的小点
文章目录: [TOC]
# 不要使用 + 和 fmt.Sprintf 操作字符串
不要使用 +
和 fmt.Sprintf
操作字符串,虽然很方便,但是真的很慢!
我们要使用 bytes.NewBufferString
进行处理。
基准测试如下:
# +
func BenchmarkStringOperation1(b *testing.B) {
b.ResetTimer()
str := ""
for i := 0; i < b.N; i++ {
str += "golang"
}
}
// 输出
goos: darwin
goarch: amd64
pkg: demo/stringoperation
cpu: Intel(R) Core(TM) i7-8700B CPU @ 3.20GHz
BenchmarkStringOperation1
BenchmarkStringOperation1-12 353318 114135 ns/op
PASS
Process finished with the exit code 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# fmt.Sprintf
func BenchmarkStringOperation2(b *testing.B) {
b.ResetTimer()
str := ""
for i := 0; i < b.N; i++ {
str = fmt.Sprintf("%s%s", str, "golang")
}
}
// 输出
goos: darwin
goarch: amd64
pkg: demo/stringoperation
cpu: Intel(R) Core(TM) i7-8700B CPU @ 3.20GHz
BenchmarkStringOperation2
BenchmarkStringOperation2-12 280140 214098 ns/op
PASS
Process finished with the exit code 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# bytes.NewBufferString
func BenchmarkStringOperation3(b *testing.B) {
b.ResetTimer()
strBuf := bytes.NewBufferString("")
for i := 0; i < b.N; i++ {
strBuf.WriteString("golang")
}
}
// 输出
goos: darwin
goarch: amd64
pkg: demo/stringoperation
cpu: Intel(R) Core(TM) i7-8700B CPU @ 3.20GHz
BenchmarkStringOperation3
BenchmarkStringOperation3-12 161292136 8.582 ns/op
PASS
Process finished with the exit code 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 对于固定字段的键值对,不要使用 map[string]interface{}
对于固定字段的键值对,不要使用 map[string]interface{}
!
我们要使用临时 Struct
。
基准测试如下:
# map[string]interface{}
func BenchmarkStructOperation1(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
var demo = map[string]interface{}{}
demo["Name"] = "Tom"
demo["Age"] = 30
}
}
// 输出
goos: darwin
goarch: amd64
pkg: demo/structoperation
cpu: Intel(R) Core(TM) i7-8700B CPU @ 3.20GHz
BenchmarkStructOperation1
BenchmarkStructOperation1-12 43300134 27.97 ns/op
PASS
Process finished with the exit code 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 临时 Struct
func BenchmarkStructOperation2(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
var demo struct {
Name string
Age int
}
demo.Name = "Tom"
demo.Age = 30
}
}
// 输出
oos: darwin
goarch: amd64
pkg: demo/structoperation
cpu: Intel(R) Core(TM) i7-8700B CPU @ 3.20GHz
BenchmarkStructOperation2
BenchmarkStructOperation2-12 1000000000 0.2388 ns/op
PASS
Process finished with the exit code 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 小结
你有类似这样的注意点吗,欢迎留言~
下面推荐阅读的这几篇文章也是关于开发中需要知道的小技术点,更多技术细节和代码讨论,可以加入到我的星球。
# 推荐阅读
编辑 (opens new window)