【Go开源宝藏】基于 Golang 语法的性能调优技巧(数组的遍历)

举报
小生凡一 发表于 2022/07/21 00:45:46 2022/07/21
【摘要】 1. 数组的遍历 数组和切片的遍历方式一样,所以我们这里就不进行区分。 我们一般用以下两种方式 直接取下标方式 for i:=0;i<len(nums);i++{ ... } 123 我...

1. 数组的遍历

数组和切片的遍历方式一样,所以我们这里就不进行区分。

我们一般用以下两种方式

  • 直接取下标方式
for i:=0;i<len(nums);i++{
	...
}

  
 
  • 1
  • 2
  • 3

我们先来讲一下这种方式,我们都知道数组在内存中存储是连续的。所以我们直接用下表取出数组中的元素,就是直接在数组的原地址中获取,这种写法比较像c语言的写法。所以这种方式是非常快的。

  • range 遍历方式
for index,item := range items{
	...
}

  
 
  • 1
  • 2
  • 3

我们再来讲一下这种方式,这种方式的情况比第一种要更加美观,和python的 for 循环遍历比较像 ,但是同样的,在遍历items数组的过程中,其实我们得到的item只是一个拷贝的值,也就是会在内存中拷贝一份items中的元素。虽然这种遍历方式比较美观,但是这较于第一种来说是,其性能是有所降低的。

benchmark测试

下面的这一段测试逻辑就是将三种遍历的方式进行 benchmark 测试,事先进行赋值并转化成字符串,然后再进行相同的操作,将字符串进行拼接。

为了测试结果尽可能的快,所以我们的字符串拼接使用了string.builder这个方法来执行。

/*
100000
BenchmarkByRange
BenchmarkByRange-8         	     763	   1393727 ns/op
BenchmarkByIndex
BenchmarkByIndex-8         	    1503	   1194054 ns/op
BenchmarkByIndexAndLen
BenchmarkByIndexAndLen-8   	    1818	    745112 ns/op
*/

func BenchmarkByRange(b *testing.B) {
	elems := make([]string, 100000, 100000)
	for i := 0; i < 100000; i++ {
		elems[i] = strconv.Itoa(i)
	}
	var builder strings.Builder
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		for _, elem := range elems {
			builder.WriteString(elem)
		}
	}
	b.StopTimer()
}

func BenchmarkByIndex(b *testing.B) {
	elems := make([]string, 100000, 100000)
	for i := 0; i < 100000; i++ {
		elems[i] = strconv.Itoa(i)
	}
	var builder strings.Builder
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		for j := 0; j < len(elems); j++ {
			builder.WriteString(elems[j])
		}
	}
	b.StopTimer()
}

func BenchmarkByIndexAndLen(b *testing.B) {
	elems := make([]string, 100000, 100000)
	for i := 0; i < 100000; i++ {
		elems[i] = strconv.Itoa(i)
	}
	length := len(elems)
	var builder strings.Builder
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		for j := 0; j < length; j++ {
			builder.WriteString(elems[j])
		}
	}
	b.StopTimer()
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

在上面的测试代码中,我们可以看出,第二种是要比第一种性能稍微高了一点。

而第三种和第二种的区别就是将数组长度往外放,也就是说,当我们需要在一段逻辑中不断遍历这个数组,我们可以事先规定好长度,因为len(nums)也是有性能影响的,所以我们在遍写代码的时候可以稍微注意一下。

文章来源: blog.csdn.net,作者:小生凡一,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_45304503/article/details/125839268

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。