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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Go语言中,有两种常见的方式可以遍数组。第一种方式是使用for循环和索引的形式遍数组。代码示例如下: ``` package main import ( "fmt" ) func main() { arr := [5]int{1, 2, 3, 4, 5} for i := 0; i < len(arr); i++ { fmt.Println(arr[i]) } } ``` 这种方式使用一个循环变量i来表示数组的索引,通过递增i的值来遍数组元素。在每次循环中,通过`arr[i]`来获取数组中的元素,并进行相应的操作。 第二种方式是使用for range循环来遍数组。代码示例如下: ``` package main import ( "fmt" ) func main() { arr := [5]int{1, 2, 3, 4, 5} for index, value := range arr { fmt.Println(index, value) } } ``` 这种方式中,for range循环数组中的每个元素,并将索引和对应的值分别赋给index和value变量。在每次循环中,可以直接使用index和value来操作数组元素。 总结起来,通过for循环加索引和for range循环是两种常见的在Go语言中遍数组方式。可以根据具体的需求选择合适的方式来进行数组的遍。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [go语言中遍数组的方法有哪些](https://blog.csdn.net/yaxuan88521/article/details/129194466)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值