基准Go代码和goroutines

时间:2016-02-05 19:20:58

标签: go benchmarking goroutine

我想对函数进行基准测试:test(),使用不同数量的线程。

没有goroutines:

var t1 = time.Now()
test()
var elapsed1 = time.Since(t1)
  

1 ns / operation

使用goroutines:

runtime.GOMAXPROCS(1)
var t1 = time.Now()
go test()
var elapsed1 = time.Since(t1)
  

1.10 ^ -6 ns / operation

我的测试功能:

func test() {
    for i := 0; i < 1000000000; i++ {
        float_result = f1 + f2
        float_result = f1 - f2
        float_result = f1 * f2
        float_result = f1 / f2
        float_result = f1 + f2
        float_result = f1 - f2
        float_result = f1 * f2
        float_result = f1 / f2
        float_result = f1 + f2
        float_result = f1 - f2
        float_result = f1 * f2
        float_result = f1 / f2
        float_result = f1 + f2
        float_result = f1 - f2
        float_result = f1 * f2
        float_result = f1 / f2
        float_result = f1 + f2
        float_result = f1 - f2
        float_result = f1 * f2
        float_result = f1 / f2
    }
}
  • 在这种情况下,当我使用goroutines时,test()函数是否已经很好地进行了基准测试?
  • 如何达到0.001ns /操作?它看起来太快了。 (2.5GHz Intel Core i7)
  • 使用runtime.GOMAXPROCS(n)的goroutine是否等同于使用n个线程?

2 个答案:

答案 0 :(得分:7)

您没有衡量go test()运行的时间,而是衡量使用// somewhere in your main package var wg sync.WaitGroup func test() { // first lines in test() should be wg.Add(1) defer wg.Done() ... } // benchmark runtime.GOMAXPROCS(1) var t1 = time.Now() go test() wg.Wait() var elapsed1 = time.Since(t1) 调用/创建新goroutine所需的时间。

你需要等待你的goroutine完成,例如使用sync.Waitgroup

valid_sizes

答案 1 :(得分:1)

你想要测试的东西如此之小,以至于测量误差占主导地位。应该调整您的基准迭代,直到基准函数持续足够长的时间以便可靠地计时。您的基准测试应该运行大约一秒钟才有意义。