数组大小对性能的影响

时间:2018-06-03 11:57:43

标签: go

我刚刚开始学习Go,我发现自己创建了一个简单的程序:

  • 创建一个int数组,其大小为SIZE(预期为> = 1000)
  • 通过0到999的元素迭代,将它们设置为0
  • 打印所有内容花了多长时间

这样的事情:

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)......

1 个答案:

答案 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                      |