golang遍历数组时,不同的赋值方式性能会不一样吗?

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

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

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值