编译二进制文件的速度比运行"go run"慢



我正在努力解决代码谜题的出现(所以,对于那些还没有完成第一天的人来说,剧透提醒(,但我遇到了一些我无法理解的事情。

我有一个函数,它根据其他数字列表生成一个数字列表,并返回第二次遇到的第一个数字:

func findFirstDoubleFrequency(freqs []int) int {
seen := map[int]bool{0: true}
freq := 0
for {
for _, f := range freqs {
freq += f
if seen[freq] == true {
return freq
}
seen[freq] = true
}
}
}

当我用go run运行我的代码时,函数需要大约15毫秒才能完成。但是,当我用go build构建一个可执行文件并运行它时,大约需要40ms才能完成。我真的很想知道为什么这些运行之间的执行时间有这么大的差异。它们不应该是一样的吗?或者类似GC的东西会用go build可执行文件减缓速度?

堆栈溢出

寻求调试帮助的问题("为什么此代码不起作用?"(必须包括所需行为、特定问题或错误以及在问题本身中复制它所需的最短代码。


您的基准无效。它是不完整的。它不可复制。


在Go中,使用testing包对代码进行基准测试。例如,

package main
import (
"math/rand"
"testing"
)
func findFirstDoubleFrequency(freqs []int) int {
seen := map[int]bool{0: true}
freq := 0
for {
for _, f := range freqs {
freq += f
if seen[freq] == true {
return freq
}
seen[freq] = true
}
}
}
func BenchmarkFirstFrequency(b *testing.B) {
freqs := make([]int, 1000)
for i := range freqs {
freqs[i] = rand.Intn(len(freqs)/10)
}
b.ReportAllocs()
b.ResetTimer()
for N := 0; N < b.N; N++ {
findFirstDoubleFrequency(freqs)
}
}

输出:

$ go test t94_test.go -bench=.
goos: linux
goarch: amd64
BenchmarkFirstFrequency-4        1000000    7206 ns/op    3342 B/op    16 allocs/op
$ 

警告:您可能有一个无限循环:

package main
import (
"math/rand"
"testing"
)
func findFirstDoubleFrequency(freqs []int) int {
seen := map[int]bool{0: true}
freq := 0
for {
for _, f := range freqs {
freq += f
if seen[freq] == true {
return freq
}
seen[freq] = true
}
}
}
func BenchmarkFirstFrequency(b *testing.B) {
freqs := make([]int, 1000)
for i := range freqs {
freqs[i] = rand.Intn(len(freqs))
}
b.ReportAllocs()
b.ResetTimer()
for N := 0; N < b.N; N++ {
findFirstDoubleFrequency(freqs)
}
}

输出:

$ go test t94_test.go -bench=.
goos: linux
goarch: amd64
BenchmarkFirstFrequency-4       fatal error: runtime: out of memory

最新更新