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%,