【问题标题】:return value from goroutine to take average time taken从 goroutine 返回值以平均花费的时间
【发布时间】:2021-04-23 23:38:51
【问题描述】:

我正在尝试对一些代码进行基准测试以检查运行情况。

func obtainData(ds DataSourceStr, number int, amount int) (totalTime time.Duration) {
    // runtime := time.Now()
    // var totalTime time.Duration
    defer wg.Done()
    //.Nanoseconds()
    // defer totalruntime :=
    // defer fmt.Println("runtime completed", time.Since(runtime))
    defer fmt.Println("startRoutine done", number, totalTime)

    for n := 0; n < amount; n++ {
        start := time.Now()

        keyArray := [10]string{"key0", "key1", "key2", "key3", "key4", "key5", "key6", "key7", "key8", "key9"}
        var key = keyArray[rand.Intn(len(keyArray))]
        ans, err := ds.Value(key)
        elapsed := time.Since(start) //.Nanoseconds()
        totalTime = elapsed + totalTime

        fmt.Println("[", n, "]", "Request: ", key, ", Response: ", ans, ", Time: ", elapsed, ", errors: ", err, ", Routine:", number, totalTime)
    }
    return totalTime
}

//how to implement benchmarks https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go
//benchmark
var wg sync.WaitGroup

func BenchmarkDatasource(b *testing.B) {
    //take the main code and run a benchmark testing the average run time.

    rand.Seed(time.Now().Unix())

    arr := map[string]string{
        "key0": "value0",
        "key1": "value1",
        "key2": "value2",
        "key3": "value3",
        "key4": "value4",
        "key5": "value5",
        "key6": "value6",
        "key7": "value7",
        "key8": "value8",
        "key9": "value9",
    }
    ds := DataSourceStr{
        Data: arr,
    }

    fmt.Println(ds)
    //get average run time of each
    // sum run time / total

    wg.Add(1)

    go obtainData(ds, 0, b.N)
    wg.Add(1)

    go obtainData(ds, 1, b.N)
    wg.Add(1)
    go obtainData(ds, 2, b.N)
    wg.Add(1)
    go obtainData(ds, 3, b.N)
    wg.Add(1)
    go obtainData(ds, 4, b.N)
    wg.Add(1)
    go obtainData(ds, 5, b.N)
    wg.Add(1)
    go obtainData(ds, 6, b.N)
    wg.Add(1)
    go obtainData(ds, 7, b.N)
    wg.Add(1)
    go obtainData(ds, 8, b.N)
    wg.Add(1)

    go obtainData(ds, 9, b.N)
    wg.Wait()
}

我希望能够计算出这些 go 例程运行的平均时间。我在上述函数中创建了一个变量来执行此操作,但我无法将该函数分配给 go-routine 中的变量,以便稍后对其求和/稍后对其进行平均。

如果不这样做,我如何获得返回值或平均花费的时间?

【问题讨论】:

  • 首先,如果不使用b.N 值,就无法正确使用基准。让基准测试代码确定花费的时间。
  • 求!目前,基准测试似乎有不错的输出——我将如何实现 b.N?
  • 参见例如如何编写基准测试:dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go。基准测试总是需要执行有问题的代码b.N 次。
  • 太棒了,现在将通过更改编辑帖子:D
  • @LeCoda b.N 应该控制您执行被测代码的次数,而不是用作被测函数的参数。但是对于您的核心问题-您为什么要尝试在基准测试中进行自己的计时?基准测试的重点是 go test 为您计算执行时间。

标签: go


【解决方案1】:

在您的场景中,我认为从 goroutine 返回值的正确方法是通过 chanel 发送它。使其缓冲并在主 goroutine 中读取 wg.Done() 之后的值。

【讨论】:

  • 让我试试看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多