02.17 GoLang多任務執行效率性能

在執行一些昂貴的計算任務時,我們希望能夠儘量利用現代服務器普遍具備的多核特性來儘量將任務並行化,從而達到降低總計算時間的目的。此時我們需要了解 CPU 核心的數量,並針對性地分解計算任務到多個 goroutine 中去並行運行。



例子:

<code>func main11() { more_cpu() one_cpu()}func more_cpu() { gproc.StartTime() wait := sync.WaitGroup{} wait.Add(5) va := make(chan int64, 5) for i := 0; i < 5; i++ { go add2(i, va, &wait) } wait.Wait() close(va) var sum int64 = 0 for a := range va { //fmt.Println(a) sum = sum + a } fmt.Println("more_cpu total time:", gproc.Uptime().String(), "sum=", sum)}func one_cpu() { gproc.StartTime() sum := 0 for i := 0; i < 5; i++ { sum = sum + add(i) } fmt.Println("one_cpu total time:", gproc.Uptime().String(), "sum=", sum)}func add(i int) int { re := 0 for i := 0; i < 10000000; i++ { re = re + i } return re}func add2(i int, c chan int64, wait *sync.WaitGroup) { defer wait.Done() re := 0 for i := 0; i < 10000000; i++ { re = re + i } c /<code>

執行結果:

可以看到,充分利用多任務執行,性能提升明顯。