这篇博客对比一些操作的性能情况。
- 循环遍历 slice 各元素
- 字符串拼接
循环遍历 slice 各元素
以 RoundRobin 的实例进行说明。在 RoundRobin 中有两种方法返回可用的服务地址
1 | type roundrobin struct { |
第一种,每次索引加一后取余数:
1 | func (r *roundrobin) module() string { |
第二种,每次索引加一后,判断如果加到最大将索引再置为 0:
1 | func (r *roundrobin) check() string { |
这两种方法结果相同,但性能有一个数量级的差距(查看完整代码):
1 | BenchmarkModule-4 100000000 13.9 ns/op |
字符串拼接
测试四种拼接方法,两种字符长度(5个字节和500个字节),两种字符个数(4个字符串和100个字符串)。一共 4×2×2=16个结果。
四种拼接方法如下(查看完整代码)
fmt.Sprintf():
1 | func byFmt(s []string) string { |
使用加号一次拼接:
1 | func byPlusOnce(s []string) string { |
使用加号多次拼接:
1 | func byPlusSplit(s []string) string { |
使用 buffer:
1 | func byBuffer(s []string) string { |
测试结果:
1 | $ go test -bench BenchmarkConcat* |
根据测试结果速度最快的是byPlusOnce()
,而不是网上说的byBuffer()
。