我刚开始学习Go,发现自己创建了一个简单的程序,该程序:
int
数组,其大小为SIZE
(预计> = 1000)像这样:
package main
import (
"time"
"fmt"
)
const SIZE = 1000
func main() {
start := time.Now()
a := [SIZE]int {}
for i := 0; i < 1000; i++ { a[i] = 0 }
fmt.Println("Time: ", time.Since(start))
}
在计算机上运行5次后,得到以下结果:
3.375µs
2.831µs
2.698µs
2.655µs
2.59µs
但是,如果将
SIZE
增加到100000
(100x),程序会变慢。这些是在同一台计算机上观察到的结果:407.844µs
432.607µs
397.67µs
465.959µs
445.101µs
为什么
SIZE
的价值如此重要?迭代次数将始终相同(1000)... 最佳答案
一句话
因为您也在计算分配 slice 的时间
说明
在您的代码中,您正在大片段start
之前创建a
变量。
func main() {
start := time.Now()
a := [SIZE]int {}
//...
}
这样,您就忽略了以下事实:分配带
1000
项的 slice 比分配带100000
项的 slice 要快得多。您必须在分配后移动此初始化。 slice 的大小不应影响循环遍历最多一定数量(相等)迭代的时间。
在我的benchmarks中:
| Items | ns/op | Count slice allocation? |
|--------|-------|-------------------------|
| 1000 | 1411 | YES |
| 100000 | 66565 | YES |
| 1000 | 837 | NO |
| 100000 | 855 | NO |
关于go - 阵列大小对性能的影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50666132/