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)
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值