登录
首页 >  Golang >  Go问答

说明不同的执行时间表现

来源:stackoverflow

时间:2024-03-22 18:09:32 146浏览 收藏

在学习 Go 语言时,作者测试了不同的回显函数实现的执行时间。使用 `go build` 命令构建代码时,第一个函数调用比第二个调用慢 10 倍,作者怀疑这是由于 `fmt.println` 的第一次调用。然而,通过 `go run` 命令运行代码时,获得的时间要少得多,作者猜测构建二进制文件会产生更有效的机器代码。作者还尝试使用基准测试技术来解释时间差异,但建议在对主题有更深入了解后再返回练习。

问题内容

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

p.s.我为我的英语感到抱歉。

upd#1

echo3 代码:

20 func echo3() {
  21     s, sep := "", ""
  22     for _, arg := range os.args[:] {
  23         s += sep + arg
  24         sep = " "
  25     }
  26     fmt.println(s)
  27 }

upd#2

➜  go-hello-world go run echo2.go
/tmp/go-build573021176/b001/exe/echo2
13019
/tmp/go-build573021176/b001/exe/echo2
1067
/tmp/go-build573021176/b001/exe/echo2
955
/tmp/go-build573021176/b001/exe/echo2
987

➜  go-hello-world ./echo2          
./echo2
199681
./echo2
19404
./echo2
5965
./echo2
4803
./echo2
4673
./echo2
8244

解决方案


尝试使用第 11.4 节中所示的基准测试技术编写一个基准测试方法,其中循环运行每个方法数百次左右。

运行之间的差异可能是由多任务操作系统和计时器分辨率等引起的各种测量误差。

此外,我认为当您进一步了解时可以返回练习(练习需要对主题有一定的熟悉度)

今天关于《说明不同的执行时间表现》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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