golang学习demo4-goroutine并行测试

2023-10-27

知识点

  • 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)
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang学习demo4-goroutine并行测试 的相关文章

  • 七. go 常见数据结构实现原理之 反射

    目录 一 golang 是如何实现反射的 如何比较两个对象完全相等 一 golang 是如何实现反射的 参考博客Go 语言问题集 Go Questions Go 语言在 reflect 包里定义了各种类型 实现了反射的各种函数 通过它们可以
  • golang sleep

    golang的休眠可以使用time包中的sleep 函数原型为 func Sleep d Duration 其中的Duration定义为 type Duration int64 Duration的单位为 nanosecond 为了便于使用
  • Go切片排序

    Go 语言标准库提供了sort包 用于对切片和用户定义的集合进行排序 具体示例如下 基本排序 package main import fmt sort func main float 从小到大排序 f float64 5 2 1 3 0 7
  • beego+goAdmin+mysql+docker+natapp作为微信小程序地服务器“伪部署”

    写在前面的话 1 为什么我要叫伪部署 答 因为我把它们放在服务器运行 都是开发模式 生产模式实在不会弄 所以就这样了 2 系统环境 答 腾讯云服务器 系统为 ubuntu 版本不记得 应该是比较高的 3 前提假设 答 假设你的服务器已经安装
  • go 进阶 go-zero相关: 七. 拦截器与熔断拦截器

    目录 一 拦截器的基础使用 1 服务端拦截器 2 客户端拦截器 二 拦截器底层底层执行原理 三 go zero默认添加的拦截器 客户端 1 熔断器拦截器 BreakerInterceptor 服务端 一 拦截器的基础使用 在go zero
  • go 进阶 gin实战相关: 五. gin_scaffold 企业脚手架

    目录 一 gin scaffold 企业级脚手架 二 gin scaffold 脚手架安装及使用演示 文件分层解释 开始使用 1 配置开启go mod 功能 2 下载 安装 gin scaffold 3 整合 golang common 4
  • Golang协程与通道整理

    协程goroutine 不由OS调度 而是用户层自行释放CPU 从而在执行体之间切换 Go在底层进行协助实现 涉及系统调用的地方由Go标准库协助释放CPU 总之 不通过OS进行切换 自行切换 系统运行开支大大降低 通道channel 并发编
  • Go语言包管理(一)

    Go语言中的包 我们在使用其他语言 比如Java Python 都有类似包的概念 Go也不例外 其核心思想即为分组和模块化 人的大脑对庞大和复杂的事情很难掌控 可以对其采用分而治之的策略 使其模块化 从而更容易管理 如下是标准库中net包的
  • 为什么最近听说 Go 岗位很少很难?

    大家好 我是煎鱼 其实这个话题已经躺在我的 TODO 里很久了 近来很多社区的小伙伴都私下来交流 也有在朋友圈看到朋友吐槽 Go 上海的大会没什么人 还不如 Rust 大会 比较尴尬 今天主要是看看为什么 Go 岗位看起来近来很难的样子 也
  • 【go语言开发】loglus日志框架的使用

    本文将简单介绍loglus框架的基本使用 并给出demo 文章目录 前言 Loglus常见用法 自定义日志级别 使用字段钩子 输出到多个位置 使用钩子实现自定义日志处理 demo
  • go-zero 开发入门-加法客服端示例

    定义 RPC 接口文件 接口文件 add proto 的内容如下 syntax proto3 package add 当 protoc gen go 版本大于 1 4 0 时需加上 go package 否则编译报错 unable to d
  • go-zero开发入门之网关往rpc服务传递数据1

    go zero 的网关往 rpc 服务传递数据时 可以使用 headers 但需要注意前缀规则 否则会发现数据传递不过去 或者对方取不到数据 go zero 的网关对服务的调用使用了第三方库 grpcurl 入口函数为 InvokeRPC
  • Go 语言中切片的使用和理解

    切片与数组类似 但更强大和灵活 与数组一样 切片也用于在单个变量中存储相同类型的多个值 然而 与数组不同的是 切片的长度可以根据需要增长和缩小 在 Go 中 有几种创建切片的方法 使用 datatype values 格式 从数组创建切片
  • 协程-单线程内的异步执行

    1 仿协程实例 不同事件依次顺序执行 coding utf 8 import time def calculate 1 step event name for index in range step print This is s even
  • 进阶之Kotin协程原理和启动方式详细讲解(优雅使用协程)

    协程就是方法调用封装成类线程的API 方法调用当然比线程切换轻量 而封装成类线程的API后 它形似线程 可手动启动 有各种运行状态 能够协作工作 能够并发执行 前言 kotlin的协程在初学者看来是一个很神奇的东西 居然能做到用同步的代码块
  • 【go语言】error错误机制及自定义错误返回类型

    简介 Go 语言通过内置的 error 接口来处理错误 该接口定义如下 type error interface Error string 这意味着任何实现了 Error 方法的类型都可以作为错误类型 在 Go 中 通常使用 errors
  • go开发--操作mysql数据库

    在 Go 中访问 MySQL 数据库并进行读写操作通常需要使用第三方的 MySQL 驱动 Go 中常用的 MySQL 驱动有 github com go sql driver mysql 和 github com go xorm xorm
  • [每周一更]-(第55期):Go的interface

    参考地址 https juejin cn post 6978322067775029261 https gobyexample com interfaces https go dev tour methods 9 介绍下Go的interfa
  • 这套Go语言开发框架组合真的非常高效

    我尝试过很多框架 从Django Flask和Laravel到NextJS和SvelteKit 到目前为止 这是我唯一可以使用的不会让我感到疯狂或者放弃项目的堆栈 框架 我喜欢所有这些框架 但我只是不太适应它们的设计方式 实际上 我是一个弱
  • Go、Docker、云原生学习笔记全攻略:从零开始,一步步走向精通!(2024版)

    第一章 Go语言学习宝典 一 介绍 01 Go 语言的前生今世 二 开发环境搭建 01 Go 语言开发环境搭建 三 初识GO语言 01 Go 多版本管理工具 02 第一个 Go 程序 hello world 与 main 函数 03 Go

随机推荐

  • 【Java基础】关于语言:编译型与解释型

    编译型 一 定义 使用专门的编译器 针对特定的平台 将高级语言源代码一次性的编译成可被该平台硬件执行的机器码 并包装成该平台所能识别的可执行性程序的格式 二 特点 程序执行前需要专门的一个编译过程 将源代码编译成机器语言 如 exe后缀的文
  • Python调用sort函数自定义排序函数

    当有一组比较复杂的对象需要进行排序时 我们的第一想法就是尽量利用已有的函数快速完成自己的排序需求 接触过c 的码友应该知道 在c 里若想利用已有的sort函数来完成复杂的排序 对运算符进行重载即可 好久没接触过c 里的概念 应该是这个叫法
  • java项目连接mysql卡死_我的Java连接数据库之后就卡住了 不能输出结果 到底是为什么呢?程序的功能是要完成一个地址的最大正向查...

    以下是基本的函数实现最重要的是第四个要实现街道的最大正向查找 ResultSetrs s executeQuery sql if rs next Stringpostaddress rs getString 1 Joutput setTex
  • 用Python开始机器学习(5:文本特征抽取与向量化)

    假设我们刚看完诺兰的大片 星际穿越 设想如何让机器来自动分析各位观众对电影的评价到底是 赞 positive 还是 踩 negative 呢 这类问题就属于情感分析问题 这类问题处理的第一步 就是将文本转换为特征 因此 这章我们只学习第一步
  • Hyperledger Fabric 应用实战(3)--配置文件core.yaml

    1 简介 core yaml主要是为Peer服务提供一些配置定义 当Peer节点启动时 会先从命令行获取参数 环境变量 和core yaml读取配置信息 通过docker去搭建一个Peer服务 命令行默认是不带参数的 主要通过docker
  • 考研 打赢这场信息站 上岸

    23考研已经结束了 新的考研马上开始 考研 是一个 持久战 也是一个 信息战 因为大多数同学都是自我监督 自我学习 所以经常出现想要摆烂 放弃的念头 意念坚定的同学只占一小部分 这个时候我们就要先在考研之前进行问题分析 这是一个非常非常重要
  • Spark Streaming入门

    什么是Spark Streaming 首先 什么是流 streaming 数据流是连续到达的无穷序列 流处理将不断流动的输入数据分成独立的单元进行处理 流处理是对流数据的低延迟处理和分析 Spark Streaming是Spark API核
  • openssl常用参数

    文章目录 前言 对称加密 标准语法 常用选项 应用示例 单向加密 标准语法 常用选项 应用示例 参考文档 前言 OpenSSL 是一个开源项目 可以实现 秘钥证书管理 对称加密和非对称加密 其主要由一下三个组件组成 openssl 多用途的
  • Synchronized与锁升级

    目录 1 先从阿里及其他大厂面试题说起 2 路线总纲 3 Synchronized的性能变化 4 Synchronized锁种类及升级步骤 4 1多线程访问情况 3种 4 2升级流程 4 3无锁 4 4偏向锁 4 5轻量级锁 4 6重量级锁
  • 【经典】springboot 配置文件统一管理

    背景 为实现快速搭建和开发 项目以Springboot框架搭建 springboot搭建的项目可以将项目直接打成jar包并运行 无需自己安装配置Tomcat或者其他服务器 是一种方便快捷的部署方式 假设项目以最常规的方式打包成一个整体的ja
  • Onvif协议学习:7、鉴权认证

    Onvif协议学习 7 鉴权认证 文章目录 Onvif协议学习 7 鉴权认证 1 前言 2 ONVIF哪些接口需要认证 3 如何认证 4 安装OpenSSL 5 实现认证 6 特别注意 原文链接 https blog csdn net be
  • QT学习(十九)——用QFile读写文件

    写文件 两种方法 1 第一种使用QString获取编辑区的内容之后直接用toUtf8 转化为QByteArray 2 第二种使用QString获取编辑区的内容之后先转化成std string 再转换成char 不过最后的文件类型都是UTF
  • Zookeeper(一)简介说明

    1 1 什么是Zookeeper Zookeeper是一个高效的分布式协调服务 它暴露了一些公用服务 比如命名 配置管理 同步控制 群组服务等 我们可以使用ZK来实现比如达成共识 集群管理 leader选举等 Zookeeper是一个高可用
  • 编写高质量代码:改善Java程序的151个建议(第9章:多线程和并发___建议125~131)

    建议125 优先选择线程池 建议126 适时选择不同的线程池来实现 建议127 lock与synchronized是不一样的 建议128 预防线程死锁 建议129 适当设置阻塞队列的长度 建议130 使用CountDownLatch协调子线
  • Spring Cloud Alibaba核心组件概述

    目录 概览 Nacos 注册中心 配置中心 Sentinel 限流 熔断降级 控制台 动态规则扩展 Seata AT模式 TCC模式 Saga模式 XA模式 Spring Cloud Gateway 关键特性 核心概念 负载均衡 概览 Sp
  • fetch整个仓库 github_为开源项目做贡献的10个步骤,GitHub贡献的简短指南

    在本文中 我将给出10个简单的步骤 以确保GitHub的贡献快速而干净 贡献的生命周期 步骤 1 fork主仓库 fork主仓库会在你的帐户中创建一个副本 你可以进行更改并将任何代码推送到此fork 而不必担心会弄乱原始代码库 单击页面顶部
  • java中tip是什么意思_tip是什么意思

    tip指的是小费或者是尖端 指点的意思 tip美音可以是 t p 英音是 t p 第三人称单数可以写为tips 复数可以直接写为tips 现在分词是tipping 过去式是tipped 列句 每次给爸妈买些东西 总是能赚到小费 Every
  • IBM --AIX 常用命令

    创建组 mkgroup id 101 info 创建用户 mkuser pgrp staff home home campaign shell usr bin ksh groups staff campaign 解压 unzip campa
  • AcWing 425. 明明的随机数

    题目 明明想在学校中请一些同学一起做一项问卷调查 为了实验的客观性 他先用计算机生成了N个1到1000之间的随机整数 对于其中重复的数字 只保留一个 把其余相同的数去掉 不同的数对应着不同的学生的学号 然后再把这些数从小到大排序 按照排好的
  • golang学习demo4-goroutine并行测试

    知识点 go语言的routine的使用 通道chan的使用 想测试一下go的routine 就写了个求大量素数的程序 分别开1 99个协程进行求解 对比结果 首先是没有开协程的 下面是开了少数几个协程的程序 可以看到在 cnt 5 的时候速