OO电梯系列优化分享
前言
本单元作业在优化方面确实有一些想法值得分享,故单开一篇博客分享一下三次作业的优化以及架构。
三次作业的共同之处在于线程之间通讯所依赖的都是共享对象,采用生产者消费者模式。
这样做的好处是框架清晰,迭代起来往往不需要再添加很多类,改调度也是一个函数的事情:D
HW5
第一次作业是单部电梯可捎带,主体上采用的是look
算法,电梯在可达楼层上下扫描,当前方向无请求则掉头,两边都无请求则等待,这里用了个小trick,开门等待,小概率能捡一些时间。共享对象“托盘”持有一个Hashmap
,以楼层号为键,楼层类为值,楼层类持有上行请求和下行请求两个线程安全队列,与电梯方向相同的队列将会被查询接收请求。托盘负责接收输入线程的输送请求以及向电梯输入请求,托盘这个类的实现是线程安全的,故输入线程和电梯线程无需加锁。
HW6
第二次作业加入电梯的数量可以是1-5台,单部电梯采取的策略还是选择了沿用第一次作业的look,多部电梯每一部一个线程,除了电梯线程和输入线程外还增加了一个主调度线程MasterScheduler
,负责任务的分派。
依然采取生产者消费者模式,不过这一次是两级的,输入与主调度之间有一个简单的共享对象Tray
负责协调、主调度和每部电梯之间都有一个共享对象Scheduler
负责协调,这个共享对象实现了子调度器接口ChildScheduler
。由于主调度器负责任务分派,因此调度函数实现在主调度器中,电梯对于请求分派不可见,只管跑就完事了。
考虑到如果有多部电梯且电梯还有容量限制,请求集中在少部分电梯上会造成忙闲不均浪费资源,因此负载均衡会取得很好的收益,所以电梯与主调度器之间还应共享一个电梯状态对象ElevatorStatus
,实例化在子调度器中,调度函数依据此来分派请求,以期取得较优效率。具体来讲,就是根据实际在电梯里的人数,对应楼层已经分派的人数以及电梯获得请求后需要移动的距离作为参考条件计算惩罚值,惩罚值最小的电梯将获得此请求,这几个条件还需要加权,经历了调参之后发现电梯人数所占的比例应该稍大一些,最后取得的性能分还不错。
第二次作业uml协作图
电梯线程只管往子调度器拿人跑,故暂未列入
HW7
第三次作业最大的不同在于动态加入电梯并且有ABC三种可达楼层不相同电梯,有些请求需要电梯之间的协作才能完成。这次基调还是生产者消费者思想,受教学视频点拨,又采用了workerThreads
模式,在上一次的基础上将电梯线程创建和启动放置在主调度器MasterScheduler
中,同时为每部电梯实例化一个子调度器Scheduler
作为“托盘”。
这次的调度还是秉承着负载均衡的原则,事先决定A类电梯作为负数楼层和15-20层之间的高速列车,B类主要负责出发地是偶数楼层的请求,C类主要负责出发地是奇数楼层的请求,当然,笔者首先在主调度器中对请求进行一定粒度的分割Dispatch
,让目的地在相应电梯的可达楼层范围之内,每个子调度器在上一次的基础上增加一个nextStage
线程安全队列用于储存被分配到的具有依赖关系的请求,如此一来,换乘问题只需要分割请求、完成先决请求后回调另外两类子调度器(例如B类子调度器通知AC类)、进行下一阶段请求这样的系列操作就得以解决。
同类电梯之间也涉及到调度,笔者直接在子调度器复用了第二次作业的调度函数,最终达到的效果也差强人意。
第三次作业uml协作图
主调度器视角:主调度器与电梯线程之间只有create关系,其他联系均通过子调度器协调。
电梯视角:getOut的时候有callBack函数查询有无下一阶段任务
OO电梯系列优化分享的更多相关文章
- 学会拒绝,是一种智慧——OO电梯章节优化框架的思考
在本章的三次作业里,每次作业我都有一个主题,分别是:托盘型共享数据.单步电梯运行优化.多部电梯运行优化,因而电梯优化实际是第二.三次作业.虽然后两次作业从性能分上看做得还不错,但阅读其他大佬博客,我深 ...
- OO电梯系列总结与反思
目录 前言 HW5 度量分析 UML类图与协作图 bug分析 HW6 度量分析 UML类图与协作图 bug分析 HW7 度量分析 UML类图与协作图 bug分析 SOLID原则 感想 前言 紧张刺激的 ...
- OO第三次电梯作业优化
目录 第三次电梯作业个人优化 前言 优化思路 一.调度器 二.电梯 第三次电梯作业个人优化 前言 由于个人能力有限,第二次电梯作业只能完成正确性设计,没能进行优化,也因此损失了强测分数,于是第三次电梯 ...
- OO第二单元优化博客
OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...
- OO第一单元优化博客
OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)\)和\(cos(x)\)的指数作为坐标,在图上画出来就可 ...
- MySQL系列-优化之like关键字 创建索引
原文: https://blog.csdn.net/ufo___/article/details/81164996 MySQL系列-优化之覆盖索引: https://blog.csdn.net/UF ...
- 电梯系列——OO Unit2分析和总结
一.摘要 本文是BUAA OO课程Unit2在课程讲授.三次作业完成.自测和互测时发现的问题,以及倾听别人的思路分享所引起个人的一些思考的总结性博客.主要包含设计策略.代码度量.BUG测试和心得体会等 ...
- SmartJS 系列规划分享和背景介绍
发布了smartjs后,有朋友问:“没看懂究竟是干嘛的”.唉,打击了,每次我都想高唱其实你不懂我的心. 今天把相关的东西都整理了一遍,给大家介绍一下.里面绝大多数都已经实现过,有些则是有新的思路重做或 ...
- OO电梯调度
告别了三次奇妙无比的求导作业之后,我们就开始搭建一部自己的电梯了.相信我们不同同学的电梯运行方式肯定各具特色吧,但值得肯定的是,在艰苦的走完了三次电梯逐步改进的作业之后,我们的电梯在正常情况下应该是可 ...
随机推荐
- js & disabled right click & disabled right menu
js & disabled right click (() => { const log = console.log; log(`disabled copy`); document.bo ...
- Flutter 创建dashboard页面
1 import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends Sta ...
- DeFi 热潮下,NGK将成为下一个财富密码
区块链正在脱虚向实,处于大规模落地,赋能实体产业的前夜,而在这个关键的关口,一个万亿市场的蓝海正在缓缓生成,成为区块链落地的急先锋,这个先锋便是DeFi. DeFi,即Decentralized Fi ...
- MySQL切换版本踩坑记录(包括恢复数据方法)
踩坑起因:在创建数据库时, 字段:create_time datetime DEFAULT CURRENT_TIMESTAMP, 报异常--Error Code: 1067 - Invalid def ...
- Python数据结构与算法_删除排序数组中的重复项(06)
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成. ...
- Python算法_排序数组(09)
给你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1]输出:[1,2,3,5] 示例 2: 输入:nums = [5,1,1,2,0,0]输出:[0,0 ...
- CentOS7安装ZooKeeper3.4.14
1:下载安装包 wget https://downloads.apache.org/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz 点击进入官网下 ...
- ffmpeg番外篇:听说这款水印曾经在某音很火?办它!
今天在瞎逛时,偶然看到一个CSDN上的哥们说,他们曾经被一个水印难住了,仔细看了下,感觉可以用一行命令实现. 需求如下:视频加gif水印,gif循环,同时n秒后水印切换位置继续循环 这哥们遇到了两个问 ...
- 解决QQ能正常上网但是网页无法打开的办法
最近网页老师稀里糊涂的打不开,在这里附上参考的行之有效的办法. https://baijiahao.baidu.com/s?id=1645363213803553998&wfr=spider& ...
- Django的视图层和模板层
目录 一.视图层 1. 小白必会三板斧 2. JsonResponse 3. FBV与CBV 3.1 FVB 3.2 CBV 4. CBV的源码 5. 给CBV加装饰器 二.模板层 1. 模板语法 2 ...