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电梯调度
告别了三次奇妙无比的求导作业之后,我们就开始搭建一部自己的电梯了.相信我们不同同学的电梯运行方式肯定各具特色吧,但值得肯定的是,在艰苦的走完了三次电梯逐步改进的作业之后,我们的电梯在正常情况下应该是可 ...
随机推荐
- input number css hidden arrow
input number css hidden arrow show arrow OK input[type="number"]::-webkit-inner-spin-butto ...
- 翻译:《实用的Python编程》02_02_Containers
目录 | 上一节 (2.1 数据类型) | 下一节 (2.3 格式化) 2.2 容器 本节讨论列表(list),字典(dict)和集合(set). 概述 通常,程序必须处理许多对象. 股票的投资组合 ...
- 06.numpy聚合运算
>>> import numpy as np >>> L = np.random.random(100) >>> L array([0.82846 ...
- 使用 Castle 实现 AOP,以及 Autofac 集成 Castle
Castle 是 2003 年诞生于 Apache Avalon 项目,目的是为了创建一个IOC 框架.发展到现在已经有四个组件: ORM组件:ActiveRecord IOC组件:Windsor 动 ...
- 数理统计16:NP理论、似然比检验、假设检验与区间估计
本文介绍Neyman-Pearson理论,这也是我们会见到的最常见假设检验问题类,这里第一Part的概念介绍略显枯燥,大家尽量理解即可.由于本系列为我独自完成的,缺少审阅,如果有任何错误,欢迎在评论区 ...
- 微信小程序(七)-项目实例(原生框架 MINA转云开发)==02-云开发-配置
云开发:1.就是用云函数的型式来使用云存储和云数据库完成各种操作! 2.只关注调什么函数,完成什么功能即可,无需关心HTTP请求哪一套! 3.此模式不代表没有服务器,只是部署在云环境中 ...
- Navicat Premium的数据传输功能----将远程Mysql数据库复制到本地数据库的方法
1.先连上本地.远程的数据库 2.在本地建一个和你要复制的远程数据库的名称一样的数据库 3.数据转移.工具-->数据传输-->填写源数据库和目标数据库-->下一步-->开始 注 ...
- 看完我的笔记不懂也会懂----MarkDown使用指南
目录 语法 [TOC] 自动生成目录 1. 标题 2. 文本强调 3. 列表 4. 图片 5. 超链接 6. 文本引用 7. 分割线 8. 代码 9. 任务列表 (MPE专属) 10. 表格 11. ...
- javascript处理HTML的Encode(转码)和解码(Decode)
HTML的Encode(转码)和解码(Decode)在平时的开发中也是经常要处理的,在这里总结了使用javascript处理HTML的Encode(转码)和解码(Decode)的常用方式 一.用浏览器 ...
- 盘点Excel中的那些有趣的“bug”
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. Excel 1.0早在1985年正式进入市场,距今已经有36年了,虽然在推出 ...