七叶笔记 » golang编程 » golang多核并发运算的优势-goroutine

golang多核并发运算的优势-goroutine

Show u all code

 package main
import (
"runtime"
"time"
)
//32s
func sum() {
  var i,sum, j int64
i = 100000000000
sum = 0

for j = 0; j<i; j++ {
sum += j
}
println(sum)
}
//6s
func sum1() {
n := runtime.GOMAXPROCS(0)
ch := make(chan int, n)
i := 100000000000
for j:=0; j<n;j++ {
//分段计算
go func(k int, c chan<-int) {
sum := 0
start := (i/n)*k
end := start + (i/n)
for l:=start; l<end;l++ {
sum+=l
}
c <- sum
}(j, ch)
}
total := 0
for m :=0; m<n;m++ {
total += <-ch
}
defer println(total)
}
func main() {
s := time.Now().UnixNano()
sum()
e := time.Now().UnixNano()
println("sum()单核计算100亿时长:nano secs:", e-s)
s1 := time.Now().UnixNano()
sum1()
e1 := time.Now().UnixNano()
println("sum1()8核计算100亿时长:nano secs:", e1-s1)
}
  

需求

计算出100亿整数累加总和,体现出goroutine的计算优势

输出结果

 932355974711512064
sum()单核计算100亿时长:nano secs: 32340388000
932355974711512064
sum1()8核计算100亿时长:nano secs: 6258451000  

计算结果已经超出了int和int64的的长度,并不重要,重要的是体会一下多核并发计算的优势。sum方法用了32s,sum1用了6s,提升4倍左右的效率。

goroutine的原理可以参考下 ,写得很清晰了。

重点是要理解它的核心思想“ CSP(communicating sequential processes)并发模型 ”。

如果想看用户态和系统负载情况可以这样操作

 go build main.go
time ./main  

输出:

 932355974711512064
sum1()8核计算100亿时长:nano secs: 6435188000
./te  46.91s user 0.24s system 730% cpu 6.446 total
  

mac下的time有毒,不能格式化

CPU负载达到了730%,

相关文章