首页 > 其他分享 >性能测试:通过简单的例子理解并发量,线程数,吞吐量,TPS

性能测试:通过简单的例子理解并发量,线程数,吞吐量,TPS

时间:2023-12-25 10:34:32浏览次数:30  
标签:后厨 烹饪 用餐 并发 TPS 餐厅 线程 顾客 老王

看个简单的例子

①老王开了家餐厅

我们的主角老王,在M市投资新开业了一家,前来用餐的顾客络绎不绝:

餐厅里有4种不同身份的人员:

 用户一次完整的用餐流程如下:

1.顾客到店小二处付款点餐    =>   

2.小二将订单转发给后厨    =>   

3.后厨与备菜工配合,取材完成烹饪后交给小二    =>     

4.小二上菜,顾客用餐。

假设所有顾客都不堂食而是打包带走,也就是不考虑用户用餐时间。餐厅完成一次订单的时间是多久?

订单时间 = 顾客点单时间 + 前台接收转发时间 + 后厨取材烹饪时间 + 后厨交给服务员,服务员上菜时间。

说白了就是每个流程的耗时相加。

假设以上时间分别为1,1,5,1(分钟),那么一次订单的完成时间就是8分钟

②问题来了

餐厅当然不可能只有一个人就餐,所以我们接下来看多人就餐的情况。

假设同一时间点上有两人就餐,会发生什么情况?

第一位用户与第一个场景一样,仍然是点单-下单-烹饪-上菜,8分钟后第一位顾客拿着打包的食物离开。

第二位用户则有所不同了。假设小二,厨师,备菜都只有一人,而且他们每个人同时只能处理一件事情。

那么第二位用户首先需要在点餐时等待小二1分钟,而后厨师烹饪第一位用户的菜时,没有任何人在为他服务。

我们来梳理一下这个过程中,每一分钟都发生了什么事情:

可以看到,两个顾客完成订单的总时长是13分钟。

继续推算我们发现,每增加一人总时长增加5分钟。

在当前的人员配置下,顾客越多,后来的顾客等待时间就越长。

③这还不是高峰期

如果餐厅在高峰时段只有两人用餐,实际一个运营得当的开封菜餐厅,在用餐高峰时段的顾客数可能高达百人。

那么问题来了,在某个普通工作日,12:00午饭时间,带着各种工牌的IT男女顾客蜂拥而至,餐厅瞬间挤进来一百人。

这个时候会发生什么?

现在餐厅已经完全服务不过来了,后续的顾客等的时间越来越长,最后一位可怜的顾客要等到差不多晚上8点才能吃到饭。

这显然是不可能的,实际上等了不到半个小时吃不上饭的顾客就都要走光了。

老王开始考虑如何应对营业高峰期的情况。

经过上面的分析,老王发现,增加各岗位人手无疑是最直观的解决办法!

我们可以计算一下人手增加的情况。假设把所有人员增加为2人配置:

那么很简单,2人就餐的情况下,由于所有人员并行服务,就餐的两名顾客可以同一时间点餐,等待烹饪,上菜后打包走人。

而后来的客人可以看作两条并行的线,那么100顾客的用餐时间就很自然的减半了。

看到这里,终于出现“并行”的概念了。

④继续调优

通过double人员配置,老王成功的使得用餐高峰期的服务能力提高了一倍,但这还不够。这种情况下,服务100顾客仍需差不多4个小时。

老王再次思考整个服务团队的配置和各环节处理能力,他发现,其瓶颈就在于“后厨”。顾客的等待时间,大部分都是在等待烹饪。

那么增加后厨能力就是重中之重,老王继续做了一系列措施:

再次double大厨人数,现在厨师们四个人同时并行做菜。

让备菜员提前将热门食材准备好。

聘请更有经验的大厨,每个餐品烹饪时间更快,加上提前备菜,整个配餐时间缩短到2分钟。

将点餐的过程改为使用手机小程序下单,让小二专注于上菜。

如此配置之下,这家开封菜终于可以在1小时之内就完成对100人顾客的就餐服务了!

 

标签:后厨,烹饪,用餐,并发,TPS,餐厅,线程,顾客,老王
From: https://www.cnblogs.com/cyq0528/p/17925604.html

相关文章

  • Qt 中的多线程 :重写 run 函数
    Qt中的多线程主要是为了防止复杂耗时的操作阻塞主线程,导致界面卡死的问题。可以通过继承QThread类后,重写run()函数来实现。一、定义继承自QThread的类定义一个类继承自QThread,并重写虚函数run(),将耗时的操作放在run()函数中,然后在主线程中来通过调用该类的start()......
  • Nginx 下将 http 改为 https
    将服务从HTTP变为HTTPS,需要进行SSL证书的配置。需要完成一下步骤:获取SSL证书安装SSL证书配置Nginx支持HTTPS重启NginxHTTP到HTTPS的重定向(可选)1.获取SSL证书(自签名证书)对于SSL/TLS证书,一般来说,它们是基于域名进行颁发的,而不是IP地址。这是因为S......
  • Python入门实战:多线程与多进程
    1.背景介绍随着信息技术的飞速发展,计算机技术也在日新月异的推进着自己的发展趋势。近几年,随着人工智能、云计算等新兴技术的兴起,计算机已经可以处理更加复杂的计算任务,如图像识别、语音识别、机器学习、数据分析等。由于这些新兴技术的需求驱动,传统的单机应用正在慢慢被替换成分布......
  • 面试官:什么是虚拟线程?为什么要有虚拟线程?
    Java中的虚拟线程,也叫做协程或“轻量级线程”,它诞生于JDK19(预览API),正式发布于JDK21,它是一种在Java虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。操作系统线程、普通线程(Java线程)和虚拟线程的关系如下:虚拟线......
  • 如何设计一个扛高并发的系统?
     什么是高并发系统?高并发系统是指:在短时间内同时有大量用户请求访问系统,需要系统能够快速、稳定地响应这些请求。高并发系统案例例如,当某个电商平台在双十一期间推出大量优惠活动时,可能会有成千上万的用户同时访问该平台,这就是一个高并发系统。在这种情况下,如果系统无法快速......
  • Java登陆第二十九天——HttpServletRequest和HttpServletResponse
    HttpServletRequestTomcat会自动将客户端请求报文封装为HttpServletRequest对象。HttpServletRequest中请求行常用方法方法描述StringgetMethod()获取请求方法StringgetProtocol()获取请求协议及版本号StringgetRequestURI()获取请求的具体资源StringB......
  • CPP创建子线程
     #include<iostream>#include<thread>usingnamespacestd;structMyStruct{inta=0;strings="abc雷";};//线程入口voidproc(MyStruct&a){for(intm=0;m<50;m++){if(a.a==0)......
  • 子线程和中断的比较
    子线程是在主线程之外创建的线程。与主线程相比,子线程通常用于执行耗时的任务,以避免阻塞主线程的运行。子线程可以同时运行多个,并且可以进行多任务处理。子线程的运行状态包括:新建状态、就绪状态、运行状态、阻塞状态和死亡状态。子线程的启动可以通过start()方法来实现,并且可以通......
  • JVM虚拟机系统性学习-JVM调优实战之内存溢出、高并发场景调优
    调优实战-内存溢出的定位与分析首先,对于以下代码如果造成内存溢出该如何进行定位呢?通过jmap与MAT工具进行定位分析代码如下:publicclassTestJvmOutOfMemory{publicstaticvoidmain(String[]args){List<Object>list=newArrayList<>();for(int......
  • Java多线程​(三)线程安全:同步及锁
    线程安全问题考虑如下情景:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票。publicclassTicketSellerextendsThread{//定义票的数量staticintticket=0;//取值范围:0~99@Overridepublicvoidrun(){while(true){......