亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嘗試并行化的速度不夠快

嘗試并行化的速度不夠快

Go
一只甜甜圈 2022-09-12 20:14:50
我閱讀了Go的并發模型,還看到了并發性和并行性之間的區別。為了測試并行執行,我編寫了以下程序。package mainimport (    "fmt"    "runtime"    "time")const count = 1e8var buffer [count]intfunc main() {    fmt.Println("GOMAXPROCS: ", runtime.GOMAXPROCS(0))    // Initialise with dummy value    for i := 0; i < count; i++ {        buffer[i] = 3    }    // Sequential operation    now := time.Now()    worker(0, count-1)    fmt.Println("sequential operation: ", time.Since(now))    // Attempt to parallelize    ch := make(chan int, 1)    now = time.Now()    go func() {        worker(0, (count/2)-1)        ch <- 1    }()    worker(count/2, count-1)    <-ch    fmt.Println("parallel operation: ", time.Since(now))}func worker(start int, end int) {    for i := start; i <= end; i++ {        task(i)    }}func task(index int) {    buffer[index] = 2 * buffer[index]}但問題是:結果不是很令人愉快。GOMAXPROCS:  8sequential operation:  206.85msparallel operation:  169.028ms使用戈魯丁確實可以加快速度,但還不夠。我預計它的速度會接近兩倍。我的代碼和/或理解有什么問題?我怎樣才能接近兩倍的速度?
查看完整描述

1 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

并行化功能強大,但很難在如此小的計算負載下看到。下面是一些結果差異較大的示例代碼:


package main


import (

    "fmt"

    "math"

    "runtime"

    "time"

)


func calctest(nCPU int) {

    fmt.Println("Routines:", nCPU)

    ch := make(chan float64, nCPU)

    startTime := time.Now()

    a := 0.0

    b := 1.0

    n := 100000.0

    deltax := (b - a) / n


    stepPerCPU := n / float64(nCPU)

    for start := 0.0; start < n; {

        stop := start + stepPerCPU

        go f(start, stop, a, deltax, ch)

        start = stop

    }


    integral := 0.0

    for i := 0; i < nCPU; i++ {

        integral += <-ch

    }


    fmt.Println(time.Now().Sub(startTime))

    fmt.Println(deltax * integral)

}


func f(start, stop, a, deltax float64, ch chan float64) {

    result := 0.0

    for i := start; i < stop; i++ {

        result += math.Sqrt(a + deltax*(i+0.5))

    }

    ch <- result

}


func main() {

    nCPU := runtime.NumCPU()

    calctest(nCPU)

    fmt.Println("")

    calctest(1)

}

這是我得到的結果:


Routines: 8

853.181μs


Routines: 1

2.031358ms


查看完整回答
反對 回復 2022-09-12
  • 1 回答
  • 0 關注
  • 79 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號