我在The Go Programming Language (Addison-Wesley Professional Computing Series)的第一章中,而书中的第三个练习要求我使用time
来衡量代码性能。
因此,我想出了以下代码。
start := time.Now()
var s, sep string
for i := 1; i < len(os.Args); i++ {
s += sep + os.Args[i]
sep = " "
}
fmt.Print(s)
fmt.Printf("\nTook %.2fs \n", time.Since(start).Seconds())
fmt.Println("------------------------------------------------")
start2 := time.Now()
fmt.Print(strings.Join(os.Args[1:], " "))
fmt.Printf("\nTook %.2fs", time.Since(start2).Seconds())
当我在Windows和Mac上运行此代码时,它总是返回0.00秒。我在代码中添加了一个暂停,以检查它是否正确并且看起来还不错。我不明白的是为什么它总是返回0.0。
答案 0 :(得分:11)
在开始时间和time.Since()
调用之间只有很少的代码,在第一个示例中只有几个字符串串联和一个fmt.Print()
调用,在第二个示例中只有一个{{1} }。这些可以由您的计算机快速执行。
如此之快,结果很可能不到一毫秒。然后,您使用fmt.Print()
动词打印经过的时间,该动词将秒舍入至2个小数位。这意味着如果经过的时间小于%.2f
,它将被四舍五入为0.005 sec
。这就是为什么看到0
打印的原因。
如果将格式更改为0.00s
,则会看到类似以下内容的
%0.12f
还要注意,由time.Duration
返回的time.Since()
值实现了fmt.Stringer
,并且将其自身智能地“格式化”为一个更有意义的单元。因此,您可以按原样打印。
例如,如果您这样打印:
Took 0.000027348000s
Took 0.000003772000s
您将看到类似以下的输出:
fmt.Println("Took", time.Since(start))
fmt.Println("Took", time.Since(start2))
还请注意,如果要评估某些代码的性能,则应使用Go的内置测试和基准测试工具,即testing
软件包。有关详细信息,请参见Order of the code and performance。