栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么添加并发会使该golang代码变慢?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么添加并发会使该golang代码变慢?

问题似乎来自您对的使用

rand.Float64()
,它使用了一个共享全局对象并带有Mutex锁。

相反,如果为每个CPU创建一个单独的

rand.New()
,将其传递到
interactions()
,然后使用它来创建
Float64()
,则会有很大的改进。


更新以显示对现在使用的问题中新示例代码的更改

rand.New()

test()
函数已修改为使用给定通道或返回结果。

func test(n int, c chan []int) []int {    source := rand.NewSource(time.Now().UnixNano())    generator := rand.New(source)    simulations := make([]int, n)    for i := range simulations {        for _, v := range simulation(NUMBER_OF_INTERACTIONS, generator) { simulations[i] += v        }       }       if c == nil {        return simulations    }       c <- simulations    return nil }

main()
功能已更新为可以运行两个测试,并输出定时结果。

func main() {    rand.Seed(time.Now().UnixNano())    nCPU := runtime.NumCPU()    runtime.GOMAXPROCS(nCPU)    fmt.Println("Number of CPUs: ", nCPU)    start := time.Now()    fmt.Println("Successful interactions: ", len(test(NUMBER_OF_SIMULATIONS, nil)))    fmt.Println(time.Since(start))    start = time.Now()    tests := make([]chan []int, nCPU)    for i := range tests {        c := make(chan []int)        go test(NUMBER_OF_SIMULATIONS/nCPU, c)        tests[i] = c    }    // Concatentate the test results    results := make([]int, NUMBER_OF_SIMULATIONS)    for i, c := range tests {        start := (NUMBER_OF_SIMULATIONS/nCPU) * i        stop := (NUMBER_OF_SIMULATIONS/nCPU) * (i+1)        copy(results[start:stop], <-c)    }    fmt.Println("Successful interactions: ", len(results))    fmt.Println(time.Since(start))}

输出是我收到的:

> CPU数量:2 >>成功的互动:1000 > 1分20.39959秒>>成功的互动:1000> 41.392299s


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/568951.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号