登录
首页 >  Golang >  Go问答

运行"go run"比编译的二进制文件更快

来源:stackoverflow

时间:2024-03-08 10:57:27 404浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《运行"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 可执行文件而减慢速度?


解决方案


堆栈溢出

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

您的基准无效。它是不完整的。它是不可重现的。

在 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

理论要掌握,实操不能落!以上关于《运行"go run"比编译的二进制文件更快》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>