事情的经过是今天发现一个同事写代码的风格和我们平常的不一样,直接用索引赋值给新的数组,他说这样性能更高,我当时是不信的,所以立马就写了代码来测试了一下。

测试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更快一点。但是性能差别不大,可以说几乎没有影响,这种写法看平常自己怎么写起来方便怎么写就可以了。

至于为什么会会这样的结果,下次我再深入研究一下。