猿问

编译的二进制文件比运行“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并运行可执行文件时,需要大约 40 毫秒才能完成。我真的很想知道为什么这些运行之间的执行时间有如此大的差异。他们不应该是一样的吗?或者像 GC 这样的东西会减慢go build可执行文件的速度?


动漫人物
浏览 151回答 1
1回答

侃侃尔雅

堆栈溢出寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。您的基准无效。这是不完整的。这是不可复制的。在 Go 中,使用testing包来对代码进行基准测试。例如,package mainimport (&nbsp; &nbsp; "math/rand"&nbsp; &nbsp; "testing")func findFirstDoubleFrequency(freqs []int) int {&nbsp; &nbsp; seen := map[int]bool{0: true}&nbsp; &nbsp; freq := 0&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; for _, f := range freqs {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; freq += f&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if seen[freq] == true {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return freq&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seen[freq] = true&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}func BenchmarkFirstFrequency(b *testing.B) {&nbsp; &nbsp; freqs := make([]int, 1000)&nbsp; &nbsp; for i := range freqs {&nbsp; &nbsp; &nbsp; &nbsp; freqs[i] = rand.Intn(len(freqs)/10)&nbsp; &nbsp; }&nbsp; &nbsp; b.ReportAllocs()&nbsp; &nbsp; b.ResetTimer()&nbsp; &nbsp; for N := 0; N < b.N; N++ {&nbsp; &nbsp; &nbsp; &nbsp; findFirstDoubleFrequency(freqs)&nbsp; &nbsp; }}输出:$ go test t94_test.go -bench=.goos: linuxgoarch: amd64BenchmarkFirstFrequency-4&nbsp; &nbsp; &nbsp; &nbsp; 1000000&nbsp; &nbsp; 7206 ns/op&nbsp; &nbsp; 3342 B/op&nbsp; &nbsp; 16 allocs/op$&nbsp;警告:你有一个可能的无限循环:package mainimport (&nbsp; &nbsp; "math/rand"&nbsp; &nbsp; "testing")func findFirstDoubleFrequency(freqs []int) int {&nbsp; &nbsp; seen := map[int]bool{0: true}&nbsp; &nbsp; freq := 0&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; for _, f := range freqs {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; freq += f&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if seen[freq] == true {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return freq&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seen[freq] = true&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}func BenchmarkFirstFrequency(b *testing.B) {&nbsp; &nbsp; freqs := make([]int, 1000)&nbsp; &nbsp; for i := range freqs {&nbsp; &nbsp; &nbsp; &nbsp; freqs[i] = rand.Intn(len(freqs))&nbsp; &nbsp; }&nbsp; &nbsp; b.ReportAllocs()&nbsp; &nbsp; b.ResetTimer()&nbsp; &nbsp; for N := 0; N < b.N; N++ {&nbsp; &nbsp; &nbsp; &nbsp; findFirstDoubleFrequency(freqs)&nbsp; &nbsp; }}输出:$ go test t94_test.go -bench=.goos: linuxgoarch: amd64BenchmarkFirstFrequency-4&nbsp; &nbsp; &nbsp; &nbsp;fatal error: runtime: out of memory
随时随地看视频慕课网APP

相关分类

Go
我要回答