gpt4 book ai didi

go - 为什么在循环中分配数组条目的速度变慢?

转载 作者:行者123 更新时间:2023-12-01 21:16:17 25 4
gpt4 key购买 nike

我发现这个奇怪的基准测试结果似乎表明,如果不以循环方式进行操作,则分配数组元素的速度会更快。希望有人可以解释它。完整的Go代码在下面,即使执行相同的操作,基准BenchmarkDirectAssignment似乎运行速度也快十倍:

package main

import "testing"

func BenchmarkLoopAssignment(b *testing.B) {
arr := make([]int, 10)
for n := 0; n < b.N; n++ {
for i := 0; i < 10; i++ {
arr[i] = n
}
}
}

func BenchmarkDirectAssignment(b *testing.B) {
arr := make([]int, 10)
for n := 0; n < b.N; n++ {
arr[0] = n
arr[1] = n
arr[2] = n
arr[3] = n
arr[4] = n
arr[5] = n
arr[6] = n
arr[7] = n
arr[8] = n
arr[9] = n
}
}
$ go test -bench=.
goos: windows
goarch: amd64
BenchmarkLoopAssignment-16 500000000 3.76 ns/op
BenchmarkDirectAssignment-16 2000000000 0.25 ns/op
PASS
ok _/D_/go_benchmark 3.107s

我已经用Java和C#复制了此代码,并得到了相同的结果-直接分配总是更快。有谁知道为什么会这样?谢谢!

最佳答案

在第一个示例中,您有一个循环。每次触发至少要跳转1次+修改并检查运行变量。那是您分配作业的开销。

在第二个示例中,您对分配进行了硬编码。这些命令可以按顺序读取。无需跳转,计数或检查相关的间接费用。

但是值得指出的是,这种差异几乎不会发生:

https://ericlippert.com/2012/12/17/performance-rant/

无论如何,您并不能将案例2用于大型列表。至少不是某些自动代码创建的这一方面,

关于go - 为什么在循环中分配数组条目的速度变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58878413/

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