14.16. 标杆分析 Goroutines

未匹配的标注

在 §13.7 章节,我们提到了 Go 函数中的性能基准测试原则。 在此我们将它应用于一个具体的范例之中:使用一个 goroutine 填充整数,然后再读取。测试中函数将被调用 N 次 (e.g. N = 1000000) 。基准测试中, BenchMarkResult 有一个 String() 方法用于输出结果。数值 N 由 gotest 决定,该值只有足够大才能判断出基准测试结果可靠合理。

基准测试同样适用于普通函数。

如果想排除一部分代码或者更具体的测算时间,你可以适当使用testing.B.StopTimer()testing.B.StartTimer()来关闭或者启动计时器。只有所有测试全部通过,基准测试才会运行。

清单 14.18—benchmark_channels.go:

package main

import (
    "fmt"
    "testing"
)

func main() {
    fmt.Println(" sync", testing.Benchmark(BenchmarkChannelSync).String())
    fmt.Println("buffered", testing.Benchmark(BenchmarkChannelBuffered).String())
}

func BenchmarkChannelSync(b *testing.B) {
    ch := make(chan int)
    go func() {
        for i := 0; i < b.N; i++ {
            ch <- i
        }
        close(ch)
    }()
    for range ch {
    }
}

func BenchmarkChannelBuffered(b *testing.B) {
    ch := make(chan int, 128)
    go func() {
        for i := 0; i < b.N; i++ {
            ch <- i
        }
        close(ch)
    }()
    for range ch {
    }
}

/* Output:

Windows:        N        Time 1 op        Operations per sec
sync        1000000        2443 ns/op    --> 409 332 / s
buffered    1000000        4850 ns/op    -->    810 477 / s
Linux:

*/

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~