go:多核並行化問題

分別用串行和並行實現了一個NUM次加法的程序,代碼以下:網絡

package main

import (
	"fmt"
	//"runtime" //執行並行段時須要引入該包
	"time"
)

const (
	NUM = 50//+運算次數
)

type vint struct {
	n []int
}

func (v vint) Doadd(p, i, n int, u []int, c chan int) {
	for ti := i; ti < n; ti++ {
		v.n[p] += u[ti]
		time.Sleep(1 * time.Second)
	}
	c <- 1
	return
}
func (v vint) Doall(ncpu int, u []int) (sum int) {
	c := make(chan int, ncpu)
	var segment int
	if NUM%ncpu == 0 {
		segment = NUM / ncpu
	} else {
		segment = NUM / (ncpu - 1)
	}

	for i := 0; i < ncpu; i++ {
		start := i * segment
		temp := start + segment
		var end int
		if temp < NUM {
			end = temp
		} else {
			end = NUM
		}
		go v.Doadd(i, start, end, 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()
	sum := 0
	for i := 0; i < NUM; i++ {
		sum += u[i]
		time.Sleep(1 * time.Second)
	}
	te := time.Now().UnixNano()
	fmt.Println((te - ts))

	return
}

  

1億*1000次(1億次運算,重複1000次)的串行和並行執行的結果以下: 併發

8核並行化時間: 105026.076ms                                      串行時間: 80704.4503msspa

                                   

由結果可知,並行化的時間開銷反而比串行大。blog

 

--------------------------------------------15/11/02更新---------------------------------------------內存

 

源自知乎回答,著做權歸做者全部。
做者:趙雪松
連接:http://www.zhihu.com/question/37061750/answer/70294889

不請自來,go的併發主要是用來解決網絡io等慢設備訪問的等待問題的,而內存偏偏不屬於這個部分。
你算自加的這個過程徹底是在內存裏,並不能體現併發的威力,相反,開了那麼多攜程並行計算的話反
而會有沒必要要的調度開銷,天然串行更快了。吶吶,咱們來改一改,假設你的計算結果或數據是須要通
過網絡來傳遞的,每次計算之後差很少有1秒的延遲(經過time.Sleep(1*time.Second)來模擬)。你再
比較一下試試。
 
根據以上建議對程序進行修改, 分別作50次+」運算,結果以下:
串行:50017.7642ms(≈50s)
並行:7001.918ms(≈7s)
--------------------------------------------------------------------------------------------------------
相關文章
相關標籤/搜索