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

时间:2018-12-02 13:08:07

标签: go

我正在尝试解决代码难题的出现(对尚未完成第一天的人来说,是这样的警告),我遇到了一些我无法解决的问题。

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

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 个答案:

答案 0 :(得分:1)

  

堆栈溢出

     

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


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


在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
相关问题