標籤:
分別用串列和並行實現了一個1億*1000次加法的程式,代碼如下:
package mainimport ("fmt"//"runtime"//執行並行段時需要引入該包"time")const (NUM = 100000000)type vint struct {n []int}func (v vint) Doadd(p, i, n int, u []int, c chan int) {tempv=v.n[p]for j := 0; j < 1000; j++ {for ti := i; ti < n; ti++ {v.n[p] += u[ti]}v.n[p]=tempv//重設v.n[p]}c <- 1return}func (v vint) Doall(ncpu int, u []int) (sum int) {c := make(chan int, ncpu)segment := NUM / ncpufor i := 0; i < ncpu; i++ {go v.Doadd(i, i*segment, (i+1)*segment, u, c)}for i := 0; i < ncpu; i++ {<-c}for i := 0; i < ncpu; i++ {sum += v.n[i]}return}func main() {/*並行段ncpu := runtime.NumCPU()runtime.GOMAXPROCS(ncpu)u := make([]int, NUM)for i := 0; i < NUM; i++ {u[i] = 1}v := new(vint)v.n = make([]int, ncpu)ts := time.Now().UnixNano()sum := v.Doall(ncpu, u)te := time.Now().UnixNano()fmt.Println((te - ts), sum)*///串列段u := make([]int, NUM)for i := 0; i < NUM; i++ {u[i] = 1}ts := time.Now().UnixNano()for j := 0; j < 1000; j++ {sum := 0for i := 0; i < NUM; i++ {sum += u[i]}}te := time.Now().UnixNano()fmt.Println((te - ts))return}
串列和並存執行的結果如下:
8核並行化時間: 105026.076ms 串列時間: 80704.4503ms
由結果可知,並行化的時間開銷反而比串列大,若各位知道原因,希望能在評論區回複解答
go:多核並行化問題