我开始通过 Donovan-Kernighan 的《Go 编程语言》一书学习 Golang。在第一章中,作者建议测试几种替代的简单回显函数实现。我使用time函数来计算执行时间,如下所示:
29 func main() {
30 var start, end int64
31 //fmt.Println("Testing echo implementation")
32 start = time.Now().UTC().UnixNano()
33 echo3()
34 end = time.Now().UTC().UnixNano()
35 fmt.Println(end - start)
36 start = time.Now().UTC().UnixNano()
37 echo3()
38 end = time.Now().UTC().UnixNano()
39 fmt.Println(end - start)
40 }
如果我使用go build ...命令构建代码,我会得到结果:
➜ go-hello-world ./echo2
./echo2
81073
./echo2
5591
正如您所看到的,与第二个调用相比,第一个调用需要十倍的时间。请注意,我echo3在两种情况下都调用相同的函数。我猜想第一次打电话需要fmt.Println很长时间。为此,我在第 31 行添加了函数调用并再次测试:
➜ go-hello-world ./echo2
Testing echo implementation
./echo2
6327
./echo2
4249
您可以看到这两个调用需要相似的时间。
但真理的来源在哪里呢?
另一个有趣的时刻是,当我通过go run ...命令运行代码时,我得到的时间要少得多:
➜ go-hello-world go run echo2.go
Testing echo implementation
/tmp/go-build040243191/b001/exe/echo2
1743
/tmp/go-build040243191/b001/exe/echo2
1133
➜ go-hello-world go run echo2.go
/tmp/go-build646239204/b001/exe/echo2
34525
/tmp/go-build646239204/b001/exe/echo2
1133
我认为当我使用构建命令创建二进制文件时,我会得到更有效的机器代码来执行。您能解释一下为什么它在实践中以这种方式起作用吗?
环境:
OS: ArchLinux 5.2.5-arch1-1-ARCH
Go: go1.12.7 linux/amd64
PS我对我的英语感到抱歉。
更新#1
墨色风雨
相关分类