gpt4 book ai didi

performance - for循环速度比较

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:16 25 4
gpt4 key购买 nike

我想知道 Go 中的 len 运算符有多快,因此我编写了一个简单的基准测试。我的期望是,通过避免在每次循环迭代期间调用 len,代码会运行得更快,但事实恰恰相反。

这是基准:

func sumArrayNumber(input []int) int {
var res int
for i, length := 0, len(input); i < length; i += 1 {
res += input[i]
}
return res
}

func sumArrayNumber2(input []int) int {
var res int
for i := 0; i < len(input); i += 1 {
res += input[i]
}
return res
}

var result int
var input = []int{3, 6, 22, 68, 11, -7, 22, 5, 0, 0, 1}

func BenchmarkSumArrayNumber(b *testing.B) {
var r int
for n := 0; n < b.N; n++ {
r = sumArrayNumber(input)
}
result = r
}

func BenchmarkSumArrayNumber2(b *testing.B) {
var r int
for n := 0; n < b.N; n++ {
r = sumArrayNumber2(input)
}
result = r
}

结果如下:

goos: windows
goarch: amd64
BenchmarkSumArrayNumber-8 300000000 4.75 ns/op
BenchmarkSumArrayNumber2-8 300000000 4.67 ns/op
PASS
ok command-line-arguments 4.000s

我通过执行以下操作确认电阻是一致的:

  • 将输入数组大小加倍大约会使每个操作的执行时间加倍。速度差异与输入数组的长度成比例。
  • 交换测试单不会影响结果。

为什么在每次循环迭代时检查 len() 的代码速度更快?

最佳答案

有人可能会争辩说,0.08ns 的差异在统计上与说一个 for 循环比另一个更快是不相关的。您可能需要多次运行相同的测试(至少超过 20 次),此时您应该能够得出平均值和标准差。

此外,还有许多因素可以加速 len() 运算符。比如 CPU 缓存和编译器优化。我认为在您的具体示例中最相关的因素是 slice 和数组的 len() 运算符只读取 slice 中的 len 字段。的数据结构。因此,它是 O(1)。

关于performance - for循环速度比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56231432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com