golang学习demo4-goroutine并行测试

约定不等于承诺〃 2023-06-16 07:52 76阅读 0赞

知识点

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

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

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

首先是没有开协程的

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

我的cpu是4个核心, 在跑这个程序的时候这个程序占了98%的cpu
在这里插入图片描述
中间过程
在这里插入图片描述
接近100个协程, 稳定在1.4s-1.5s之间
在这里插入图片描述

源代码

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. "time"
  6. )
  7. var ch = make(chan int)
  8. func isPrime(num int) (yes bool) {
  9. if num == 2 {
  10. return true
  11. } else if num < 2 {
  12. return false
  13. }
  14. for i := 2; i < num; i++ {
  15. if num % i == 0 {
  16. return false
  17. }
  18. }
  19. return true
  20. }
  21. func process(from int, to int, cnt int) {
  22. for i := from; i < to; i++ {
  23. if isPrime(i) {
  24. cnt += 1
  25. }
  26. }
  27. ch <- cnt
  28. }
  29. func main() {
  30. allCnt := 100000 // 求3 - allCnt 范围的素数个数
  31. for cnt := 1; cnt < 100; cnt++ {
  32. var all = 0
  33. oneCnt := allCnt / cnt // 平均每个协程 oneCnt 个
  34. var start = time.Now()
  35. for i := 0; i < cnt; i++ {
  36. min := math.Min(float64(oneCnt*(i + 1)), 100000)
  37. go process(oneCnt*i, int(min), 0) // 并行求解
  38. }
  39. for i := 0; i < cnt; i++ {
  40. all += <- ch
  41. }
  42. var end = time.Now()
  43. fmt.Printf("time: %v\n", end.Sub(start))
  44. fmt.Printf("cnt = %v, ans = %v\n", cnt, all)
  45. }
  46. }

发表评论

表情:
评论列表 (有 0 条评论,76人围观)

还没有评论,来说两句吧...

相关阅读

    相关 golang: goroutine与线程

    可增长的栈 OS线程(操作系统线程)一般都有固定的栈内存(通常为2MB),一个goroutine的栈在其生命周期开始时只有很小的栈(典型情况下2KB),goroutine的栈