gpt4 book ai didi

go - 为什么会导致 goroutine 创建的测量时间不同?

转载 作者:数据小太阳 更新时间:2023-10-29 03:25:54 25 4
gpt4 key购买 nike

考虑以下应用程序,旨在测量 goroutine 创建延迟。假设我们使用 GOMAXPROCS=2 运行。

package main

import "fmt"
import "time"

const numRuns = 10000

type timeRecord struct{
Ts time.Time
Msg string
}

var timeStamps []timeRecord

func threadMain(done chan bool) {
timeStamps = append(timeStamps, timeRecord{time.Now(), "Inside thread"})
done <- true
}

func main() {
timeStamps = make([]timeRecord, 0, numRuns*2)
done := make(chan bool)
dummy := 0
for i := 0; i < numRuns; i++ {
timeStamps = append(timeStamps, timeRecord{time.Now(), "Before creation"})
go threadMain(done)
<-done
}

// Regularize
regularizedTime := make([]time.Duration, numRuns*2)
for i := 0; i < len(timeStamps) ; i++ {
regularizedTime[i] = timeStamps[i].Ts.Sub(timeStamps[0].Ts)
}

// Fake timetraced
fmt.Printf("%6d ns (+%6d ns): %s\n", 0, 0, timeStamps[0].Msg)
for i := 1; i < len(timeStamps) ; i++ {
fmt.Printf("%8d ns (+%6d ns): %s\n", regularizedTime[i], (regularizedTime[i] - regularizedTime[i-1]).Nanoseconds(), timeStamps[i].Msg)
}
}

在我的服务器上,从 Before creationInside thread,这始终输出大约一个中值 260 ns delta。现在考虑主要方法的以下变体。

timeStamps = make([]timeRecord, 0, numRuns*2)
done := make(chan bool)
dummy := 0
for i := 0; i < numRuns; i++ {
timeStamps = append(timeStamps, timeRecord{time.Now(), "Before creation"})
go threadMain(done)
for j := 0; j < 1000; j++ {
dummy += j
}
<-done
}

在这种变化下,相同的时间增量大约需要 890 ns

显然,确切的数字是特定于机器的,但数字之间的差异很好奇。从逻辑上讲,如果我在“创建前”和“内部线程”之间进行测量,在 go 语句之后添加额外的逻辑似乎不应该增加时间,但确实如此。

有没有人知道为什么时间增加没有发生在预期的位置?

最佳答案

Go 调度器是协作的。它只能在程序的某些点将当前 goroutine 切换到另一个 goroutine,例如函数调用、读取/写入 channel 等。我希望您观察到的差异是由于 goroutine 稍后启动(之后添加的 for 循环)。

关于go - 为什么会导致 goroutine 创建的测量时间不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42038289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com