事情的经过是今天发现一个同事写代码的风格和我们平常的不一样,直接用索引赋值给新的数组,他说这样性能更高,我当时是不信的,所以立马就写了代码来测试了一下。
测试demo如下:
//构造1000000个数据
type T struct {
a int
b string
}
a := T{77, "Sunset Strip"}
list:=make([]T,1000000)
for i:=0;i<1000000;i++{
list[i]=a
}
比如说上面这个list是我们需要遍历的切片,
他的写法:遍历之前先new个固定长度的slice出来,然后用数组的索引赋值。
rst:=make([]*T,len(list))
for i:= range list{
v:=&T{
a:list[i].a+1,
b:list[i].b,
}
rst[i] = v
}
我们平常的写法:肯定是用append去一个一个的追加上去
var r []*T
for _,j:= range list{
v:=&T{
a:j.a+1,
b:j.b,
}
r = append(r,v)
}
所以,现在的测试点就是:到底是直接索引赋值性能好还是append好还是没影响呢?
我这边把数组的数量从10增加到10000000;
发现速度差别还是很明显的,甚至有时候会差一个数量级(纳秒)。当元素数量越来越大时差距会稍微小一点。
结果还真是不服不行啊!
然后又测试了一下,直接取数组值和通过索引的区别:
A:
var s []*T
for i:= range list{
v:=&T{
a:list[i].a+1,
b:list[i].b,
}
s = append(s,v)
}
B:
var r []*T
for _,j:= range list{
v:=&T{
a:j.a+1,
b:j.b,
}
r = append(r,v)
}
通过不同数量级的数据运行发现,还真是直接用key比value更快一点,也就是A更快一点。但是性能差别不大,可以说几乎没有影响,这种写法看平常自己怎么写起来方便怎么写就可以了。
至于为什么会会这样的结果,下次我再深入研究一下。