我刚开始学习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)...

    最佳答案

    一句话

    因为您也在计算分配 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/

    10-15 03:38
    查看更多