用程序的思想浅谈优化福州一中发书
作者:福州第一中学 陈靖一
转载请注明出处 http://www.cnblogs.com/turtlegood/
欢迎用用我写的网站:享作业(zuoye.us)——一人记作业,全班齐分享!
1 现状
当一个班级派来的几名代表想要搬书时,必须首先先在外面等待相当长的一段时间。排队排到了以后,就进入存有书的小房间。这个房间里有两个人(设为A、B),房间内有码的整整齐齐的半房间书,和许多捆、许多叠散放在地上的书(捆指100本工厂生产的、还有带子捆住的书,叠指一捆书拆开带子后剩下的一部分书)。
代表先报上自己的班级和人数,A就会新拿出一张小纸条,上面印有某某书每人要几本,并在上面写下这个班总共要几本某某书。写完之后,他就会一项接一项地念单子上的东西。每念一项,他就停下来,在旁边的B就从地上的那些书中找到需要的。如果A要求的小于100本,B就看看有没有不成捆的书,有则从中数出要求的,没有则拆开一捆书。如果大于100本,B除了上述的做法,还会给几捆书。所有给的书,都是B处理后用手指着叫其中一个代表搬出去数数,并要求所有的书都要数过(工厂处理的一捆也不例外)。如果代表数后发现书的数量有错误,则在回到里头来要求再拿几本或还几本。
而且,AB二人经常同时处理几个班级。因此,B本来在拿我所在的班级的294本书,却被4班的同学误以为是他们的(因为他们的书也才拿了一部分),便搬走了,造成了糊涂账。
此外,再介绍一下其它情况。福州一中高一共16个班,每个班人数都在50人上下。一捆书是100本,其中每25本就会换个方向叠上去,所以可以很容易地从中分离25的倍数本,而分离非这个数就需要一本一本点数了。
2 改进方案
2.1 内存对齐:假设一个班50人
现有的方式是“有几个人,点几本书,再叫你自己点,再多退少补。”例如我们班需要294本书,那么B就会拿出两捆书,再拿出一捆,由他拆开,再由他点出6本放到桌子上(桌子上都是几本几本的零散的书),剩下的再交给我们。这一整个过程中,拆开和点出6本非常花时间,而都是由B来做的,这就是一个性能瓶颈。
考虑到反正他都要我们重新数一遍(有时一叠书的确会差一两本),B可以将书全部以50或100本的规格来输出。例如294本,他就给我们3捆,我们点数之后再退还。如果是147本,他就给一捆和50本(如之前所说,50本比47本好点多了,而且50本可以预处理,而47不行)。这样,AB两人(调度器)的的耗时就会减少,代表们的等待就能减少了。
这种方案将B(服务器、调度器)的工作转交给了代表(客户端、工作线程)来做,减少调度器负载,避免无法调度的问题。
2.2 减少调度器负载:自助多退少补
如前面所说,假设一个班50人可以极大地将调度器负载转移到工作线程(代表)上,避免响应延迟的问题。本段的方法与那个方法结合使用更佳。
我们先看看原来的情况。如果某个代表数出多了或少了几本书,就会回来告诉A。A并不会检查真实性(真的是代表吗,真的多了少了书吗),直接就从桌子上给书或拿走书了。从安全性的角度考虑,这里肯定要增加一道权限检查。那既然一中并没有这么做,新的方法也不检查这一道了。
考虑到就算A来帮忙,也是从桌上拿书或放书,代表们应该多了书就自己把它放到那张桌子上,少了就从中拿。这样,调度器负载又能显著降低了。
2.3 关闭并发:处理完一个班后再处理下一个
如上所说,现有模式是服务器经常出现并发情况。A、B说话时,并没有每一句话都明确交代是和谁讲的,导致代表理解错误。让我们看看并发的过程:CPU挂起线程1并保存状态,运行线程2,等一会儿之后再继续运行线程1并恢复状态。电脑的保存恢复挂起等操作不会花费多少时间。而且,我们说服务器并发效率高,是因为服务器是多核的,而且存在等待、避免阻塞、异步等情况。
而人类的情况不一样。人脑并非电脑,恢复状态会经常出错,这些操作也非常费时,还会费大脑,让人糊里糊涂的,最后只会造成效率降低。如果强制要求处理完一个班后才能接下一个任务,就能避免如上的问题。也许有人会觉得,这样想要多退少补的人就要等很久了。但是如果使用了前一点的建议,这个问题将不复存在。
2.4 调度器异步:AB两人独立处理事
现在的情况是,A发出拿某书的指令后,就在那儿看着、等着B拿书。这里“看”的时间就花去了不少。也许有人认为,这样看是为了避免数错书,但如果使用了第一个建议,这就没必要了。这样看,一点好处都没有。
既然这样,AB两人应该分开独立做事,互不干扰。这样,原来只有一个“工作窗口”,现在就有两个了,效率是原来的两倍。也许有人认为,一个人既要看纸条,又要弄东西,两个工作之间的切换很费时间。但是别忘了,现在由于只有50和100本两种规格,给每个代表的书都是一样的,多弄几次几乎都不要再看纸条了,不会费多少大脑。
另一种做法是,A负责将书拆成50本,B负责原来AB干的工作,这样也可以节约时间。
2.5 预处理:先拆成50本,先摆好每个班一堆
如果说上一种方法有切换任务浪费时间之嫌,那么可以使用这种预处理方式。由于第一个优化,现在假设每个班的人数都相同,于是每个班的哪种本子数也相同。这样,AB两人可以先将每个班的所有本子摆成一堆,代表来时叫每个班拿走一堆即可。(例如,每个班都是300本科作业,50本笔记,一堆中就放了这样的350本书。)
2.6 减少查找:书按某种顺序摆
现在的情况是,如果某种书给完了,AB就从那半个教室的“存货”中拿出一捆,随意地放在已有的、正在使用的许多捆书中。如果B要某种书,就得用眼睛扫视一遍,才能找到。
参考数据库的索引,B可以将书按照某种顺序来摆。例如,B可以按照那张小纸条上打印的书单顺序,这样就可以从左到右地拿出书来了。
转载于:https://www.cnblogs.com/turtlegood/p/3947615.html
用程序的思想浅谈优化福州一中发书相关推荐
- 单片机sleep函数的头文件_单片机代码模块化设计思想浅谈
前言:前段时间分享的文章[单片机裸机代码框架设计思路],很多读者给我留言,觉得很不错,对于初学者而言,这是一个进阶的技巧,对于我而言,这是对自己总结和表达能力的一个提升. 本文章我们再谈谈单片机代码的 ...
- 基于Vue实现一个简易的小程序框架,浅谈kafka | 每日掘金第 194 期
Hello,又到了每天一次的下午茶时间.酱酱们的下午茶新增优质作者介绍和码上掘金板块,专注于发掘站内优质创作者和优质内容,欢迎大家多提宝贵意见! 酱酱们的下午茶全新改版,欢迎大家多提宝贵意见! 本文字 ...
- php程序员怎么样,浅谈PHP程序员如何修炼?
本篇文章给大家带来的内容是浅谈PHP程序员如何修炼?有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 语言 2019年是不安分的一年,身为程序员的我们也是恐慌不已,大厂各种裁员,整的程 ...
- 浅谈优化SQLServer数据库服务器内存配置的策略
引文 http://demo.nbarticle.com/view/2004/8/9/view_1827.htm 农业银行总行1998年以来正式推广了新版网络版综合业务统计信息系统,该系统是基于Win ...
- 苏东坡书法美学思想浅谈
国书法博大精深,说到中华五千年文化,不能不谈及中国书法,说到中国书法,又不能不谈苏中东坡. 苏东坡,即苏轼,为北宋文学家,书画家.他是唐宋八大家之一,与父苏洵,弟苏辙和称"三苏", ...
- iPhone程序运行流程浅谈
1. 和大多数语言一样,每一个iPhone应用也都是从主函数开始运行,它的main函数都在XCode的Other Reasource逻辑目录下. [cpp] view plaincopyprint? ...
- 网络应用程序设计模式:浅谈CS架构与BS架构
CS架构与BS架构的区别 应用程序 单机程序 网络应用程序 网络应用程序设计模式 CS架构 CS架构优缺点 BS架构 BS架构优缺点 应用程序 应用程序是指为了完成特定任务而被开发运行于操作系统之上的 ...
- 老顽固在13英寸苹果笔记本MacBook Air上开发C#.NET程序的感受浅谈
为什么80%的码农都做不了架构师?>>> 换新笔记本出发点: 1:老婆说今年表现不错,没招花惹草,发点儿奖励,看我喜欢写程序就换个崭新笔记本. 2:从第一次看超薄的苹果电脑后, ...
- 从程序员角度浅谈君子九思
文章目录 君子九思 程序员的君子九思 视思明 听思聪 色思温 貌思恭 言思忠 事思敬 疑思问 忿思难 见得思义 君子九思 孔子曰:"君子有九思:视思明,听思聪,色思温,貌思恭,言思忠,事思敬 ...
最新文章
- SAP MM 分期付款场景下的付款方式
- nginx 405 not allowed问题的解决
- workerman在linux上怎么运行,linux系统中workerman的安装步骤
- SRAM与SDRAM的区别
- if delete annotation.xml in project folder, not local service folder
- Takeown--夺取文件or文件夹所有权
- 【OS学习笔记】四十 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务二代码
- 【转】ABP源码分析四十三:ZERO的本地化
- Vue笔记-vue3中.en.dev文件及axios.defaults.baseURL的使用
- 提取某一个镇的行政边界_关于获取某个省份下面的 镇的 行政区划编码。
- 曝iPhone 12 Pro耗电异常,没开启任何应用电量也急剧下降
- html.textboxfor属性,label标签中的for属性与form属性
- Android APK文件解析
- 【nginx】nginx的工作模式和信号量控制
- Linux内核源代码阅读
- B2B行业使用什么CRM好? B2B行业的专属CRM—协同级CRM
- leetcode寻找重复数
- 世界十大名言是什么?
- 最近火爆全网的猫猫回收站教程,小七给你们搞来了
- 网易游戏AI Lab 招聘CV日常实习生
热门文章
- java 定时关机_「window定时关机命令」电脑定时关机命令,这个方法适用于win7及以下系统 - seo实验室...
- <四>关于flv格式解析
- scrapy爬虫下载文件、重命名文件
- 尚硅谷李立超老师讲解web前端网课笔记
- 五大方面:机器学习如何在不久的将来改变教育
- ADSP-21489的开发详解:VDSP+自己编程写代码开发(1-如何来做21489和21479的开发?简单说两句)
- 【阿里聚安全·安全周刊】科学家警告外星恶意代码|新方法任意解锁iPhone
- 【更新】数据库解决方案Data Abstract 9发布丨附下载
- matlab 求矩阵秩,求Matlab中矩阵的秩和迹 | 学步园
- 神舟 mini pc Android,轻巧小机身 神舟mini PC/PCS明日爆款