首页 > 解决方案 > `go run` 和 `go build` 的不同运行时长

问题描述

为什么当我使用go runvsgo build并执行我的程序时,我的程序的运行时间会发生变化?

我正在使用time包来测量程序执行期间经过的时间,我偶然发现了这种行为。

package main

import (
    "fmt"
    "io/ioutil"
    "time"
)

func sumInt(b []byte, c chan int) {
    sum := 0
    for _, num := range b {
        sum += int(num)
    }
    c <- sum
}

func main() {
    start := time.Now()

    dat, err := ioutil.ReadFile("nums.txt")
    if err != nil {
        return
    }

    partSum1 := make(chan int)
    partSum2 := make(chan int)

    go sumInt(dat[:len(dat)/2], partSum1)
    go sumInt(dat[len(dat)/2:], partSum2)

    sum := <-partSum1 + <-partSum2
    fmt.Println(sum)

    elapsed := time.Since(start)
    fmt.Printf("Elapsed %s\n", elapsed)
}
❱ go run runtime.go 
2502263
Elapsed 133.893µs
❱ go build runtime.go 
❱ ./runtime 
2502263
Elapsed 402.435µs
❱ 

标签: go

解决方案


在 Go 中,我们不赞成无意义的微基准测试。如果要运行基准测试,请使用 Gotesting包。

例如,

输出:

$ go test sum_test.go -bench=. -benchmem
goos: linux
goarch: amd64
BenchmarkSum-8    500000    2905 ns/op    4288 B/op    3 allocs/op
$

sum_test.go

package main

import (
    "testing"
)

func sumInt(b []byte, c chan int) {
    sum := 0
    for _, num := range b {
        sum += int(num)
    }
    c <- sum
}

func BenchmarkSum(b *testing.B) {
    for N := 0; N < b.N; N++ {
        dat := make([]byte, 4*1024)
        partSum1 := make(chan int)
        partSum2 := make(chan int)
        go sumInt(dat[:len(dat)/2], partSum1)
        go sumInt(dat[len(dat)/2:], partSum2)
        sum := <-partSum1 + <-partSum2
        _ = sum
    }
}

推荐阅读