我刚刚开始学习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)......
答案 0 :(得分:1)
因为您还在计算分配切片的时间
在您的代码中,您要在大切片start
之前创建a
变量。
func main() {
start := time.Now()
a := [SIZE]int {}
//...
}
通过执行此操作,您忽略了使用1000
项分配切片比使用100000
项分配切片要快得多的事实。
分配后必须移动此初始化。切片的大小不应影响循环到一定数量(相等)迭代的时间。
在我的benchmarks:
中| Items | ns/op | Count slice allocation? |
|--------|-------|-------------------------|
| 1000 | 1411 | YES |
| 100000 | 66565 | YES |
| 1000 | 837 | NO |
| 100000 | 855 | NO |