我开始通过 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./echo281073./echo25591正如您所看到的,与第二个调用相比,第一个调用需要十倍的时间。请注意,我echo3在两种情况下都调用相同的函数。我猜想第一次打电话需要fmt.Println很长时间。为此,我在第 31 行添加了函数调用并再次测试:➜ go-hello-world ./echo2Testing echo implementation./echo26327./echo24249您可以看到这两个调用需要相似的时间。但真理的来源在哪里呢?另一个有趣的时刻是,当我通过go run ...命令运行代码时,我得到的时间要少得多:➜ go-hello-world go run echo2.goTesting echo implementation/tmp/go-build040243191/b001/exe/echo21743/tmp/go-build040243191/b001/exe/echo21133➜ go-hello-world go run echo2.go/tmp/go-build646239204/b001/exe/echo234525/tmp/go-build646239204/b001/exe/echo21133我认为当我使用构建命令创建二进制文件时,我会得到更有效的机器代码来执行。您能解释一下为什么它在实践中以这种方式起作用吗?环境:OS: ArchLinux 5.2.5-arch1-1-ARCHGo: go1.12.7 linux/amd64PS我对我的英语感到抱歉。更新#1
1 回答
墨色风雨
TA贡献1853条经验 获得超6个赞
尝试使用第 11.4 节中所示的基准测试技术编写一个基准测试方法,其中循环运行每个方法数百次左右。
运行之间的差异可能是由多任务操作系统和计时器分辨率等引起的各种测量误差。
另外,我认为当你进一步了解时可以返回练习(练习需要对主题有一定的熟悉度)
- 1 回答
- 0 关注
- 117 浏览
添加回答
举报
0/150
提交
取消