协程求素数的代码效率测试 | 学习笔记

简介: 快速学习协程求素数的代码效率测试

开发者学堂课程【Go语言核心编程 - 面向对象、文件、单元测试、反射、TCP编程协程求素数的代码效率测试】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9761


协程求素数的代码效率测试


即使意义不大,但现在需要证明一个地方,如果我们用 goroutine 和 channel 进行一个并发,现在我们进行的是并行,因为做了四个 cpu,但是到底效率是否有提高呢?大家肯定有所怀疑,因此我们可以使用 goroutine 完成后,可以在使用传统的方法统计一下,看看完成这个任务,各自耗费的时间是多少。大家可以猜测提高了多少倍,例如,四倍,因为使用了四个 cpu,我们可以来证明一下。教大家以后怎么去测。这个是很简单的。

 

内容介绍


一、测试效率

二、课堂作业

三、channel 使用细节和注意事项

 

一、 测试效率

代码如下:

Start := time.Now().Unix()

//开启一个协程,,向 intChan 放入1-8000个数

Go putNum(intChan)

讲解:putNum 就算是开始,time.Now().Unix()这个就是关于 Unix 的一个时间簇,我们需要知道怎样这个才算结束,这个就算结束了。在这里,打印跟我们的任务没有关系,理论上说,close 就算是结束了,一旦拿到四个退出,就说明这个任务就是完成了。

//开启四个协程,,从 intChan 取出数据并判断是否为素数,(素数是除了一和它本身能整除,其余不能整除的素数)如果是,就放入到 primeChan

for i := 0; i< 4; i++{

go putNum(intChan, primeChan, exitChan)

}

讲解:接下来,我们再做一个 end 的实践,统计一下我们的效率。代码如下:

End := time.Now().Unix()

Fmt.println(“使用协程耗时=”,end-start)//直接打印出时间

讲解:讲完之后,我们可以让它运行,数字为8000,为了直接看到效果,就将打印先关闭,运行时,数值代为8000,因为打印太耗费时间。因为最主要的部分是

For i :=0; I < 4; i ++{

<- exitChan

}

讲解:此时,我们将代码运行一遍,看看效果。要在打印中吧 res 删除,不需要打印,把其他都保存,时间打出来就好。运行时发现,这个时间太长,所以我们需要换一个数字,换为1000试一试,并将时间延迟关掉,//time . sleep(time . millisecond * 10);再次运行,我们可以发现,数据速度太快,得到下图:

image.png

放入8000个数字的时候,耗费了一秒的时间;将8000改为20000,再次运行,看到这个也是很快;再次将数字换为80000,再次运行,

得到下图:

image.png

我们可以看到耗时2秒,是正确的,

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

close(primeChan)

}()

for 1 := 0; 1 <= 8000; 1++{ //循环

intChan<- 1

}

for {

//time . sleep(time . millisecond * 10)

num, ok:=<- intChan

if  ! ok { //intChan取不到

break

}

讲解:接下来,我们使用传统的方法做一个测试。先新建一个文件 test.go,再将统计代码粘贴,直接使用 for 循环,

Package main

Import (

“time”

“fmt”

)

Func main()  {

讲解:使用外层 for 循环,这里使用 num,如果 num 最后出来,就是一个,一般经过 for 循环,一个数据就出来了,将结果打印出来,将开始的数据放到前面,将耗时的代码也放入,看看花了多少时间,没有协程的普通的方法是放入 Fmt.println(“普通的方法耗时=”,end-start),放入 fmt 包包,理论上这个大概在八秒,不能低于这个。保存看代码,得到下图:

image.png

可以看到,这里的时间是10秒,从这里我们可以感受到,使用协程确实是更好一些,

Start := time.Now().Unix()

For num := 1; num <= 80000; num++{

flag  := true //假设是素数

//判断 num 是不是素数

for i := 2; I < num;i++ {

if num % 1 == q {//说明该 num 不是素数

flag = false

break//退出 for 循环。退出 for 循环,就取不到东西

}

}

If flag{

//将这个数就放入到 primeChan

//primeChan<-num

}

}

end := time.Now().Unix()

Fmt.println(“普通的方法耗时=”,end-start)//直接打印出时间

 

二、课堂作业(只有做了,才能会)

image.png

在老师讲的基础,同学们对于这些问题会更加熟练,会更加有思路。要求同学们都去做,只有做了,才能学会,只要能理解通,才会。

 

三、channel 使用细节和注意事项

使用 go 协程后,执行的速度,比普通方法提高至少4倍

讲解:这个还跟 cpu 有关系,大家可以尝试更多可能,将个别数字更改,但其实速度并不会有多大区别,我们可以试运行,发现其实时间变化没有多大改变,协程是作用在4个 cpu 上的,所以不会开更多协程就时间更短,因为 cpu 是定性的,所以很难改变,我们可以看任务管理器,看到 cpu 直接上升的很快,如果 cpu 都利用起来,就说明我们已经用的很好了,

image.png

相关文章
|
27天前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
29 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
29天前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
2月前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
27天前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
129 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
27天前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
19 2
|
27天前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
49 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
2月前
|
Java C++
代码文件间重复性测试
本文介绍了如何使用代码相似性检测工具simian来找出代码文件中的重复行,并通过示例指令展示了如何将检测结果输出到指定的文本文件中。
|
1月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
18 0
|
2月前
|
机器学习/深度学习 敏捷开发 测试技术
软件测试的艺术:从代码到用户心灵的旅程
在阅读本文之前,让我们先共同思考一个问题:“为什么即使是最小的错误,也可能对用户体验和企业声誉造成巨大的影响?” 正如我们将要探讨的,软件测试不仅是技术活动的一种,更是确保产品质量、优化用户体验和维持品牌声誉的关键步骤。本文将引导您了解软件测试的基本概念,探索其背后的艺术性,以及如何高效地实施测试策略来达到最佳的质量保证结果。
27 0
|
5月前
|
Go Python
使用python实现一个用户态协程
【6月更文挑战第28天】本文探讨了如何在Python中实现类似Golang中协程(goroutines)和通道(channels)的概念。文章最后提到了`wait_for`函数在处理超时和取消操作中的作
50 1
使用python实现一个用户态协程