【问题标题】:Why does `time.Since(start).Seconds()` always return 0?为什么`time.Since(start).Seconds()`总是返回0?
【发布时间】:2019-04-23 13:51:47
【问题描述】:

我在第一章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。

【问题讨论】:

  • 为什么我的问题被否决了?请发表评论,以便我知道要改进的地方

标签: go time


【解决方案1】:

在您的开始时间和time.Since() 调用之间几乎没有代码,在第一个示例中只有几个字符串连接和一个fmt.Print() 调用,在第二个示例中只有一个fmt.Print() 调用。这些由您的计算机执行得非常快。

如此之快,结果很可能不到一毫秒。然后使用%.2f 动词打印经过的时间,该动词将秒数舍入 为2 个小数位。这意味着如果经过的时间小于0.005 sec,它将四舍五入为0。这就是为什么您会看到 0.00s 打印出来的原因。

如果您将格式更改为%0.12f,您将看到如下内容:

Took 0.000027348000s 
Took 0.000003772000s

还要注意time.Since() 返回的time.Duration 值实现了fmt.Stringer,并且它智能地将自身“格式化”为更有意义的单位。所以你可以按原样打印。

例如,如果您这样打印:

fmt.Println("Took", time.Since(start))
fmt.Println("Took", time.Since(start2))

你会看到类似这样的输出:

Took 18.608µs
Took 2.873µs

还要注意,如果你想测量一些代码的性能,你应该使用 Go 的内置测试和基准测试工具,即 testing 包。详情请见Order of the code and performance

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-24
    • 2016-09-16
    • 2020-05-25
    • 2013-02-26
    • 2013-06-25
    • 1970-01-01
    • 2013-02-14
    相关资源
    最近更新 更多