为了账号安全,请及时绑定邮箱和手机立即绑定

编译的二进制文件比运行“go run”慢

编译的二进制文件比运行“go run”慢

Go
动漫人物 2023-05-15 10:32:56
我正在尝试解决代码谜题的出现(所以对于那些还没有完成第一天的人来说剧透警告),我遇到了一些我无法理解的事情。我有一个函数,它根据其他一些数字列表生成一个数字列表,并返回第二次遇到的第一个数字: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可执行文件的速度?
查看完整描述

1 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

堆栈溢出

寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。


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


在 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


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信