OO第二单元优化博客

第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同。

总计一下look算法的几个特点:

1、没有主次请求的区分。

2、电梯会一直往当前方向运行直到需要转向,转向条件为:

​ (1)当前电梯中没有乘客的目的楼层在当前方向上。

​ (2)当前方向上的楼层目前没有请求。

3、捎带时只捎带请求与当前方向相同的乘客。

​ (由于第五次第六次作业没有容量限制,所以可以把当前楼层上的所有请求全部拿进来)

另外,还有一些奇怪的优化:

1、在\(close\)和\(arrive\)时候记一下时间\(t_1\),下一次运行的时候可以根据当前时间\(t_2\),少\(sleep(t_2-t_1)\)的时间。

2、若电梯长时间没有收到请求,可以利用休息的时间\(t\),根据下一次需要到达的楼层来节约时间。

​ 在第五次作业中,每次可以节约\(min([t/500ms],|target-now|)*500ms\)的时间;

​ 在第六、七次作业中,由于需要输出\(arrive\),最多每次能节约\(400ms\)

这种反现实优化被我们称为“薛定谔电梯”,直观上来看,就是100%预测下一次的运行方向和楼层数,休息的时候直接往那里走,被称为薛定谔是因为:在你给出下一个请求之前,你永远不知道我的电梯到底在哪(第五次作业)。

关于架构上的感悟&多电梯:

第五次作业的\(CPU\) \(time\)限制支持暴力轮询;

第六次第七次大部分同学应该都用的\(wait\&notify\),为了代码复用和简单架构,我在暴力轮询的循环里加了\(sleep(10)\),就能够控制\(CPU\) \(time\)在\(1s\)左右。

没有请求队列,模拟现实生活中的楼房\(Building\)类和楼层\(Floor\)类,将请求无条件放在对应楼层,电梯再去取人,所有的同步锁都只放在\(Floor\)类中,避免死锁。

多电梯中,将\(A,B,C\)三部电梯对应到三个不同的\(Building\)对象,用一个分配器分配,分配策略为平均(摸了)。

OO第二单元优化博客的更多相关文章

  1. OO第一单元优化博客

    OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)​\)和\(cos(x)​\)的指数作为坐标,在图上画出来就可 ...

  2. BUAA_OO第二单元总结性博客作业——多线程电梯架构

    一.设计策略 在第一次作业时,我刚第一次接触多线程这个东西……于是乎对于第一次VIP直上直下一次只接一个人的电梯,我借鉴了指导书中为我们提供的架构,设计了一个输入线程和一个电梯线程,并设置了一个中间类 ...

  3. oo第二单元作业总结

    oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...

  4. OO第4次博客作业

    OO第4次博客作业 一.第4单元设计 第四单元主要围绕UML图的结构进行JAVA代码编写,对JAVA的层次结构进行更多的认识.个人认为编程操作在实质上与上一章的PathContainer有许多的相同之 ...

  5. 【OO学习】OO第二单元作业总结

    OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...

  6. OO第二单元小结

    OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...

  7. OO第二单元多线程电梯总结

    OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...

  8. [BUAA OO]第三次博客作业

    OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼 ...

  9. OO第三次博客作业——规格

    OO第三次博客作业——规格 一.调研结果: 规格的历史: 引自博文链接:http://blog.sina.com.cn/s/blog_473d5bba010001x9.html 传统科学的特点是发现世 ...

随机推荐

  1. HTML入门7

    这篇来些可能用的比较少的,调试HTML 程序员调试代码常见,遇到问题一切正常,找出问题解决,满足 来了解下HTML调试, 在浏览器解析和显示之前HTML不会被编译成其他形式,只是解析而不是编译因此运行 ...

  2. HTML入门3

    HTML主要工作在于编辑文本结构和文本内容,也称语义(semantics)以便能够再浏览器正确地显示,下面开始介绍在文本中添加标题,段落,强调语句,创建列表等等 基础:标题和段落 内容结构化会使得阅读 ...

  3. 腾讯云“智能+互联网TechDay”:揭秘智慧出行核心技术与创新实践

    现如今,地面交通出行与大家的生活息息相关.在当前城市道路日益复杂和拥挤的情况下,如何保证交通出行的安全和便捷相信是每个人以及众多专家.科研工作者重点关注的问题. “智慧交通”系统是解决交通发展瓶颈的有 ...

  4. 在多个平台如何安装Python

    最近的一个项目,架构师米洛需要用的mqtt,服务器开发的时候,竟然用的python脚本.运行python就需要安装开发环境,好吧,百度一下就知道了大神廖雪峰.以下部分测试通过,转载记录如下. 因为Py ...

  5. ASM: Active Shape Models--Their Training and Application

    这篇论文的前半部分基本就是论文<Training Models of Shape from Sets of Examples>的全部内容,只不过多两个应用示例,后半部分在PDM模型的基础上 ...

  6. Vue学习记录第二天

    又来做笔记啦,今天又自暴自弃了,还好及时清醒过来了,什么时候努力都不晚,主要是要一直坚持下去,只要坚持就一定会有收获,所有成功得人背后都是付出了巨大得努力的,没有人平白无故的成功.看似光鲜亮丽的背后, ...

  7. 初识springboot

    一.springboot简介: 1.简化spring应用开发框架 2.把spring所有技术整合在了一起 3.J2EE开发的一站式解决方案 我曾经学习springMVC时候,那许许多多的配置文件的配置 ...

  8. linux alias 命令 查看系统设置的命令别名

    alias命令用于查看或设置命令别名,但仅作用于该次登陆的会话,若要永久使用别名,可在 ~/.bashrc 中设定别名 [root@MongoDB ~]# alias // 查看别名 [root@Mo ...

  9. levmar : Levenberg-Marquardt库编译

    levmar : Levenberg-Marquardt 是非线性优化的一个库 1.使用CMake生成sln项目,编译 clapack库 在levmar工程中,打开misc.c文件,在最开始添加#in ...

  10. iOS MJExtension的使用

    前言: MJExtension是iOS的字典装模型的一个第三方框架.相对于JSONKit和SBJson相比MJExtension更简单易用.功能更强大. 安装: 使用CocoaPods导入(Cocoa ...