为什么time.Since(start).Seconds()总是返回0?

时间:2019-04-23 04:58:10

标签: go time

我在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。

1 个答案:

答案 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