golang学习demo4-goroutine并行测试

知识点

  • go语言的routine的使用
  • 通道chan的使用

想测试一下go的routine, 就写了个求大量素数的程序.

分别开1-99个协程进行求解, 对比结果

首先是没有开协程的

下面是开了少数几个协程的程序, 可以看到在 cnt = 5 的时候速度已经基本不会变了, 最开始只有一个协程是是4s, 后面大概编程1.6s, 还是有几倍的提升的

我的cpu是4个核心, 在跑这个程序的时候这个程序占了98%的cpu
golang学习demo4-goroutine并行测试_第1张图片
中间过程
golang学习demo4-goroutine并行测试_第2张图片
接近100个协程, 稳定在1.4s-1.5s之间
golang学习demo4-goroutine并行测试_第3张图片

源代码

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)
	}
}

你可能感兴趣的:(golang)