[珠玑之椟]估算的应用与Little定律
[珠玑之椟]估算的应用与Little定律
估算的数据主要依赖于所能获得的数据和常识,有时还包括实践而不仅仅是理论。它常常作为一个大问题中的子问题,恰当地估算可以省去精确计算的时间和开销。在计算机领域,所谓常识的内容很宽泛,比如硬盘的传输速度、CPU每秒能执行多少指令、各种数据结构的大小甚至每分钟录入的单词数。有些数据是能够从各种资料中查得的,但仅仅靠记忆总难免遗漏;如果有经过学习而建立起的系统的知识结构,那便能很方便地把这些常识组织起来,除此以外,还可以靠平时经验的积累和一些面试题上的启发了。这里将进行一个收集,随时更新。
Little定律深入了估算所依赖的法则的细节:总花费等于各个部分的花费再乘以总的部分数,它在计算机系统方面的一些计算中十分有用。
计算机方面的估算问题:
1.硬盘文件读写速度的小问题:是否能超过10MB/s?(笔者某次面试中被问到的的一个关于服务器的问题的子问题)
分析:根据以往拷贝文件的经验,对于不是多个零散小文件的情况,读写速度比这个值要快得多,因此做出了肯定的答案。
2.确定一个空循环for(i=0;i<n;i++)在一秒钟执行的次数n,使其为CPU在1秒钟内执行总指令数目的一半(《编程之美》第一章的子问题)
分析:先把空循环化为汇编指令:

loop:
mov dx i
inc dx
mov i dx
cmp i n
jl loop

一共5条指令,假设使用的CPU是单核2.4GHz即每秒2.4G个时钟周期,(常识)现代CPU每个时钟周期执行两条以上的代码,那么一秒钟可以执行空循环(2 400 000 000 *2)/5 = 960 000 000次。
(为了提高精度而进行降低数量级的优化不再讨论)
3.struct node {int i; struct node *p}是否可以将这样的2 000 000个结点装入128MB内存的计算机中?(《编程珠玑》7.2性能估计)
分析:为了简化讨论,假定在32位机上int和指针都是32位的,共用了8B,直接计算的结果是只需16MB空间,而《编程珠玑》作者的128MB的计算机通常有85MB空闲,看上去是够用的。然而使用malloc()为结点分配空间时会额外占用空间(原因:malloc的机制,Linux的malloc()有一个每次分配的最小大小,小于这个值也会分配这么多;struct的对齐),这个值在作者计算机上是40B,导致了一共占用了96MB空间,事实上是不够用的。
4.运算的实际消耗时间:使用for(i=0;i<n;i++) fa =sqrt(10.0);计算单次sqrt()的运行时间是否准确?(《编程珠玑》7.2性能估计)
实际的单次运算时间可能慢得多,因为sqrt()可能保存了最近参数作为起始值。
(更多待补充……)
估算常用法则:
1.“72法则”:以年利率r%进行投资y年,如果r * y = 72,那么投资差不多会翻倍。
如果以t = (1+r/100)y,并把r代换成72/y,即t = (1+72/(100y))y,进行作图,会发现这一段t的值都在2附近,符合这条法则。
应用:假设一个指数程序解决n=40的问题需要10s,且n每增加1运行时间就增加12%,那么根据72法则,n每增加6,运行时间就加倍。进一步地,n每增加60,运行时间就为原来的1000倍(210的近似数)。
2.(记忆常识)π秒是一个纳世纪。
注:一年有3.155 * 107秒,而π取3.14、纳世纪为100年 * 10-9 ,这时两者的积与这个值近似。
3.Little定律:队列中物体的平均数量为进入速率与平均停留时间的乘积。
注:显而易见的法则是,总开销等于每个开销乘以单元的个数;而Litte定律描述的是一个动态系统。如果想了解定律的证明,需要随机过程与排队论的相关知识。
应用:多用户系统的响应时间公式,思考时间z的n个用户登录到响应时间r的系统,每个用户周期都为用户的思考和系统响应,即z+r;作业总数为n,那么对一个时间点来看,平均负荷为n、平均响应时间为z+r,吞吐量为x(每个时间单位处理的作业数),根据Little定律,n = x*(z+r),这样就可以求解r = n/x -z。
例1:(编程珠玑(续),7.4节)一个计算机系统,包括磁盘、处理器、操作系统和20个思考时间为20秒的终端,通过观察,它的磁盘每处理一个作业就要处理100个数据请求,而磁盘每秒钟可以处理25个请求。那么系统的吞吐量和响应时间各为多少?
解答:吞吐量直接计算,为25/100=0.25个作业/秒,响应时间r = 20/0.25 -20 = 60秒。这在流平衡下就是精确解。
例2:(编程珠玑(续),习题7.8)假设一个作业在某机器上执行时间是20秒,该机器一次可能同时执行10个作业,而你的作业是100等待执行的作业中的最后一个,作业以先进先出方式执行。大概需要等多久才能等到作业执行结束?
解答:这里要考虑两个排队系统:待执行任务队列和计算机系统本身。根据Little定律,第二个系统任务输出率X=L/R,L=10个任务,R=20秒,因此X=0.5个任务/秒。这也是第二个系统的任务到达率。因此最后一个任务会在前99个任务在198秒后完成时进入,再加上20秒的执行时间,总的时间是218秒。
往期回顾:
“珠玑之椟”系列简介与索引
位向量/位图的定义和应用
[珠玑之椟]估算的应用与Little定律的更多相关文章
- [珠玑之椟]浅谈代码正确性:循环不变式、断言、debug
这个主题和代码的实际写作有关,而且内容和用法相互交织,以下只是对于其内容的一个划分.<编程珠玑>上只用了两个章节20页左右的篇幅介绍,如果希望能获得更多的实例和技巧,我比较推崇<程序 ...
- Programming pearls 编程珠玑的题目
Programming pearls 编程珠玑的题目 这段时间有空都在看编程珠玑,很经典的一本书,一边看一边用 python 做上面的题目,我做的都放到 github 上了 https://githu ...
- 《编程珠玑(第2版)》【PDF】下载
<编程珠玑(第2版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382225 内容简介 书的内容围绕程序设计人员面对的一系列实 ...
- Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- Book-编程珠玑-第一章
第一章...二〇一六年十月二十五日 22:41:45 1MB存储空间里大约可以存143,000个号码; 如果每个号码都使用32位整数来表示的话,1MB存储空间里就可以存储250,000个号码; 看得迷 ...
- Hadoop map和reduce数量估算
Hadoop在运行一个mapreduce job之前,需要估算这个job的maptask数和reducetask数.首先分析一下job的maptask数,当一个job提交时,jobclient首先分析 ...
- mysql时该如何估算内存的消耗,公式如何计算?
经常有人问配置mysql时该如何估算内存的消耗.那么该使用什么公式来计算呢? 关心内存怎么使用的原因是可以理解的.如果配置mysql服务器使用太少的内存会导致性能不是最优的;如果配置了太多的内存则会导 ...
- Oracle Flashback Technologies - 估算不同时间段闪回日志的产生量
Oracle Flashback Technologies - 估算不同时间段闪回日志的产生量 v$flashback_database_stat监控闪回数据的i/o开销的统计信息,根据之前的系统负载 ...
- 读书笔记--编程珠玑II
学化学的应该都知道chemdraw,这是一款专门绘制化学结构的软件,什么苯环.双键各种word难以搞定的分子式,你可以轻松的用chemdraw完成,可以称得上化学工作者居家旅行必备的良药.其实早在19 ...
随机推荐
- HDU 5001 概率DP || 记忆化搜索
2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP 測 ...
- linux 多个源文件在编译时会产生一个目标文件
obj-m := target.o target-objs := src1.o src2.o src3.o 版权声明:本文博客原创文章.博客,未经同意,不得转载.
- c#万能视频播放器(附代码)
原文:c#万能视频播放器(附代码) c#万能视频播放器 本人之前很多的文章中均提到了使用libvlc为播放器内核制作的播放器,也许有些朋友对此感兴趣,于是我用c#写了一个调用libvlc api实现的 ...
- 二叉树(8)----第一个二叉树K层节点和二进制部分K叶节点层,递归和非递归
1.二进制定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeN ...
- 屏幕录制H.264视频,AAC音频,MP4复,LibRTMP现场活动
上周完成了一个屏幕录制节目,实时屏幕捕获.记录,视频H.264压缩,音频应用AAC压缩,复用MP4格公式,这使得计算机和ios设备上直接播放.支持HTML5的播放器都能够放,这是标准格式的优点.抓屏也 ...
- Singal Page App:使用Knockout和RequireJS创建高度模块化的单页应用引擎
Singal Page App 开篇扯淡 距离上一篇文章已经有好几个月,也不是没有时间记录点东西,主要是换了新的工作,在一家外资工作,目前的工作内容大多都是前端开发,新接触的东西因为时间原因,大多还不 ...
- 让.NET程序快速释放内存的办法
原文:让.NET程序快速释放内存的办法 公司里的一个程序,经过了N个人的手后发现上了生产内存会一直涨,直到物理内存几乎被占用完毕后突然就下降下来(估计是GC给释放了),然后再一直涨.这个程序主要是对字 ...
- C语言JSON-RPC
近期对json-rpc比較感兴趣,思想非常easy,并且看到了非常多不同语言的实现.在github上 hmngomes 的 json-rpc-c (实现的是server端,基于TCP流),短 ...
- Libcurl最初的实现tfp上传和下载功能
研究报告指出的目标是使用libcurl实现ftp文件上传和下载功能 一.Libcurlde简要 Libcurl的而且易于使用的利用url进行文件传输的库. , libcurl当前支持DICT, FIL ...
- JavaScript精彩范例(1)——Jquery EasyUI应用的一个框架实例
从网上看到的,非常漂亮,放在这里和大家分享一下,作者是疯狂秀才 这是截图 >>这是下载地址<<