go 语言协程与普通流程运行效果对比

场景介绍

判断 1 ~ 30万之间所有的素数, 将素数记录到切片

普通流程

package main

import "time"

// 判断某个数是否为素数
func findPrimeNumber(num int) bool {
	if num < 2 {
		return false
	}
	var isPrime bool = true
	for i := 2; i < num; i++ {
		if num%i == 0 {
			return false
		}
	}
	return isPrime
}

func main() {
	// 记录起始时间
	start := time.Now().Unix()
	var resArr = []int{}
	for i := 2; i <= 300000; i++ {
		res := findPrimeNumber(i)
		if res {
			resArr = append(resArr, i)
		}
	}
	// 记录结束时间
	end := time.Now().Unix()

	println(len(resArr), end-start)
	
}
//运行结果 :  数据总数 25997 耗时 29 秒

开启协程模式

package main

import (
	"sync"
	"time"
)

var wg sync.WaitGroup

var resArr []int

// 判断某个数是否为素数
func findPrimeNumber(num int) bool {
	if num < 2 {
		return false
	}
	var isPrime bool = true
	for i := 2; i < num; i++ {
		if num%i == 0 {
			return false
		}
	}
	return isPrime
}

func findPrimeNumbers(startNum int) {
	for i := startNum * 30000; i <= 30000+startNum*30000; i++ {
		res := findPrimeNumber(i)
		if res {
			resArr = append(resArr, i)
		}
	}
	wg.Done()
}

func main() {
	// 记录起始时间
	start := time.Now().Unix()
	// 并发执行
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go findPrimeNumbers(i)
	}
	wg.Wait()
	// 记录结束时间
	end := time.Now().Unix()

	println(len(resArr), end-start)
}
//运行结果 :  数据总数 25993 耗时 9 秒

开启协程后程序执行时间明显缩短, 但存在一个数据记录丢失的问题( 通过并发/并行 变量的值产生了写入冲突问题 ), 请观看下一节, 我们将利用管道来解决数据记录问题.