Go语言 如何高效率 统计200000以内的素数 (Golang经典编程案例)

案例:以最短的时间,统计200000以内的素数。

思路

  1. 写一个for循环,判断各个数是不是素数;
  2. 使用并发/并行的方式,将统计素数的任务分配给8个goroutine去完成。

下面分别用两种方式统计:

代码1:使用for循环

package main

import (
	"time"
	"fmt"
)

func main() {

	start := time.Now().Unix()
	for num := 1; num <= 200000; num++ {
		//判断num是不是素数
		for i := 2; i < num; i++ {
			if num % i == 0 {//说明该num不是素数
				break
			}
		}
	}
	end := time.Now().Unix()
	fmt.Println("普通的方法耗时=", end - start)
}

执行结果如下图:
Go语言 如何高效率 统计200000以内的素数 (Golang经典编程案例)_第1张图片

代码2:使用 goroutine和channel完成

package main

import (
	"fmt"
	"time"
)

//向 intChan放入 200000个数
func putNum(intChan chan int) {

	for i := 1; i <= 200000; i++ {
		intChan<- i
	}
	//关闭intChan
	close(intChan)
}

// 从 intChan取出数据,并判断是否为素数,如果是,就放入到primeChan
func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {

	//使用for 循环
	var flag bool
	for {
		//time.Sleep(time.Millisecond * 10)
		num, ok := <-intChan //intChan 取不到..

		if !ok {
			break
		}
		flag = true //假设是素数
		//判断num是不是素数
		for i := 2; i < num; i++ {
			if num % i == 0 {//说明该num不是素数
				flag = false
				break
			}
		}

		if flag {
			//将这个数就放入到primeChan
			primeChan<- num
		}
	}

	//fmt.Println("有一个primeNum 协程因为取不到数据,退出")
	//这里我们还不能关闭 primeChan,向 exitChan 写入true
	exitChan<- true
}

func main() {

	intChan := make(chan int , 1000)
	primeChan := make(chan int, 30000)//放入结果
	exitChan := make(chan bool, 8) //标识退出的管道 4个

	start := time.Now().Unix()
	//开启一个协程,向 intChan放入 1-8000个数
	go putNum(intChan)
	//开启4个协程,从 intChan取出数据,并判断是否为素数,如果是,就放入到primeChan
	for i := 0; i < 8; i++ {
		go primeNum(intChan, primeChan, exitChan)
	}

	//这里我们主线程,进行处理
	go func(){
		for i := 0; i < 8; i++ {
			<-exitChan
		}

		end := time.Now().Unix()
		fmt.Println("使用协程耗时=", end - start)

		//当我们从exitChan 取出了4个结果,就可以放心的关闭 primeChan
		close(primeChan)
	}()

	//遍历我们的 primeChan ,把结果取出
	for {
		_, ok := <-primeChan
		if !ok{
			break
		}
		//将结果输出
		//fmt.Printf("素数=%d\n", res)
	}

	fmt.Println("main线程退出")

}

执行结果如下:
Go语言 如何高效率 统计200000以内的素数 (Golang经典编程案例)_第2张图片
只用2秒即可完成。

你可能感兴趣的:(Go语言经典编程案例,Go语言经典编程案例)