带有goroutines的基准



在这里对golang来说很新,并在用goroutines进行基准测试时遇到了问题。

我拥有的代码在这里:

    type store struct{}
    
    func (n *store) WriteSpan(span interface{}) error {
        return nil
    }
    
    func smallTest(times int, b *testing.B) {
        writer := store{}
        var wg sync.WaitGroup
        numGoroutines := times
        wg.Add(numGoroutines)
        b.ResetTimer()
        b.ReportAllocs()
        for n := 0; n < numGoroutines; n++ {
            go func() {
                writer.WriteSpan(nil)
                wg.Done()
            }()
        }
        wg.Wait()
    }
    func BenchmarkTest1(b *testing.B) {
        smallTest(1000000, b)
    }
    
    func BenchmarkTest2(b *testing.B) {
        smallTest(10000000, b)
    }

在我看来,这两种情况的运行时间和分配都应该相似,但是运行它们会给我以下结果,这会大不相同。想知道为什么会发生这种情况?这些额外的分配来自哪里?

BenchmarkTest1-12 10000000 0.26 NS/OP 0 B/OP 0 Allocs/op

BenchmarkTest2-12 1 2868129398 NS/OP 31872 B/OP 83 Allocs/op

通过

我还注意到,如果我多次将内部循环添加到writeSpan,则与numGoroutines * multiple times相关的运行时和分配类型。如果这不是人们使用Goroutines进行基准测试的方式,还有其他标准测试方法吗?预先感谢。


如果这不是人们用goroutines进行基准测试的方式,在那里 还有其他标准测试方法吗?

这不是基准任何东西的方法。基准实际问题。

您运行了大量的goroutines,它们无能为力,直到您将调度程序,机器和其他资源饱和为止。这仅仅证明了如果您运行任何足够的时间,您可以将机器屈膝。

相关内容

  • 没有找到相关文章

最新更新