go - `go run` 和 `go build` 的不同运行时长
问题描述
为什么当我使用go run
vsgo 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 中,我们不赞成无意义的微基准测试。如果要运行基准测试,请使用 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
}
}
推荐阅读
- r - 创建一个 geom_line 或类似的,下面带有“fading” alpha
- reactjs - 弹出的 Create-React-App 无法从 Atlaskit 包中转换 node_modules 代码
- makefile - 如何从 Makefile 打印扩展变量?
- .net - 服务总线处置对象
- python - 如何使用 python 创建一个 azure datafactory 资源文件夹?
- bash - netcat 和heredoc 的可能竞争条件
- jquery - jquery,有没有办法在包含特定id的页面时,触发jquery函数?
- android - 如何在 MenuItem 中使用位图作为图标
- python - 有没有办法允许用户使用 Django 更改他们的 Active Directory 密码
- android - Firebase signInWithCustomToken 使用 AWS Cognito 生成的令牌