golang学习demo4-goroutine并行测试
知识点
- go语言的routine的使用
- 通道chan的使用
想测试一下go的routine, 就写了个求大量素数的程序.
分别开1-99个协程进行求解, 对比结果
首先是没有开协程的
下面是开了少数几个协程的程序, 可以看到在 cnt = 5 的时候速度已经基本不会变了, 最开始只有一个协程是是4s, 后面大概编程1.6s, 还是有几倍的提升的
我的cpu是4个核心, 在跑这个程序的时候这个程序占了98%的cpu
中间过程
接近100个协程, 稳定在1.4s-1.5s之间
源代码
package main
import (
"fmt"
"math"
"time"
)
var ch = make(chan int)
func isPrime(num int) (yes bool) {
if num == 2 {
return true
} else if num < 2 {
return false
}
for i := 2; i < num; i++ {
if num % i == 0 {
return false
}
}
return true
}
func process(from int, to int, cnt int) {
for i := from; i < to; i++ {
if isPrime(i) {
cnt += 1
}
}
ch <- cnt
}
func main() {
allCnt := 100000 // 求3 - allCnt 范围的素数个数
for cnt := 1; cnt < 100; cnt++ {
var all = 0
oneCnt := allCnt / cnt // 平均每个协程 oneCnt 个
var start = time.Now()
for i := 0; i < cnt; i++ {
min := math.Min(float64(oneCnt*(i + 1)), 100000)
go process(oneCnt*i, int(min), 0) // 并行求解
}
for i := 0; i < cnt; i++ {
all += <- ch
}
var end = time.Now()
fmt.Printf("time: %v\n", end.Sub(start))
fmt.Printf("cnt = %v, ans = %v\n", cnt, all)
}
}
还没有评论,来说两句吧...