解释一下执行时间差异

我开始通过 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


红颜莎娜
浏览 125回答 1
1回答

墨色风雨

尝试使用第 11.4 节中所示的基准测试技术编写一个基准测试方法,其中循环运行每个方法数百次左右。运行之间的差异可能是由多任务操作系统和计时器分辨率等引起的各种测量误差。另外,我认为当你进一步了解时可以返回练习(练习需要对主题有一定的熟悉度)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go