我在第一章“ Go编程语言”(Addison-Wesley专业计算系列)上,而书中的第3个练习要求我使用来衡量代码性能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())
Run Code Online (Sandbox Code Playgroud)
当我在Windows和Mac上运行此代码时,它总是返回0.00秒。我在代码中添加了一个暂停,以检查它是否正确并且看起来还不错。我不明白的是为什么它总是返回0.0。
icz*_*cza 11
在开始时间和time.Since()调用之间只有很少的代码,在第一个示例中只有几个字符串串联和一个fmt.Print()调用,在第二个示例中只有一个fmt.Print()调用。这些由计算机非常快速地执行。
如此之快,结果很可能不到一毫秒。然后使用%.2f动词打印经过的时间,该动词将秒舍入为2个小数位。这意味着如果经过的时间少于0.005 sec,则将四舍五入为0。这就是为什么您看到0.00s打印的原因。
如果将格式更改为%0.12f,您将看到类似以下内容:
Took 0.000027348000s
Took 0.000003772000s
Run Code Online (Sandbox Code Playgroud)
还请注意,Implements time.Duration返回的值会智能地将自身“格式化”为更有意义的单元。因此,您可以按原样打印。time.Since()fmt.Stringer
例如,如果您这样打印:
fmt.Println("Took", time.Since(start))
fmt.Println("Took", time.Since(start2))
Run Code Online (Sandbox Code Playgroud)
您将看到类似以下的输出:
Took 18.608µs
Took 2.873µs
Run Code Online (Sandbox Code Playgroud)
还要注意,如果要衡量某些代码的性能,则应使用Go的内置测试和基准测试工具,即testing软件包。有关详细信息,请参见代码顺序和性能。