珠玑第二部分性能"/>
编程珠玑第二部分性能
程序性能分析
设计层面
-
问题定义:追求快速系统,可能在定义该系统需要解决的问题时就已经注定成败了。
-
系统机构:将大型系统分解成模块,也许是决定其性能的最重要的单个因素
-
算法和数据结构:获得快速模板的关键通常是表示数据的数据的结构和操作这些数据的算法
-
代码调优:有时候对代码的一点改进可以获得很大的性能优化
-
系统软件:有时候改变系统所基于的软件比改变系统本省更容易
-
硬件:更快的硬件可以提高系统的性能
原理
计算机系统中最廉价、最快速且最可靠的原件是根本不存在的
当程序性能问题无法回避时,考虑设计层面会有助于程序员集中精力解决问题
- 如果仅需要较小的加速,就对效果最佳的层面做改进,投入最小的精力就可以获得最大加速系数的那个设计层面
- 如果需要较大的加速,就对多个层面做改进。
1、希望自己的系统可靠吗?
在设计初期就应该建立可靠性,否则以后很难加上,设计数据结构时,应该使其能够在部分受损时恢复信息。通过仔细地查看和简单的运行来检查代码,并进行广泛的测试,在可靠的操作系统上,在使用错误校正内存的冗余硬件系统中运行软件,制定一个计划,以便在系统崩溃(一定会崩溃)时能够快速回复。仔细记录每次崩溃以便学习
2、在提高效率之前先确保正确性,这句话对吗
“在提高效率之前先确保正确性”通常是一个好建议,但是,eg:一个文档生成系统的例子,该系统需要几个小时才能生成一本书,这个程序跟其他任何大型系统一样,今天有10个已知的小错误,下个月又将出现10个新的错误,如果让你在纠正当前的10个错误和使程序提速10倍之间选择,你会选择哪一个?
粗略估算
基本技巧
- 两个答案比一个答案好
- 快速检验
量纲检验(单位一致化)
- 经验法则
72法则:假设以年利率r%投资一笔钱y年,金融版本的“72法则”指出,如果r*y=72,那么你的投资差不多会翻倍。
π秒就是一个纳世纪
- 实践
- 安全系数
Little定律
Little定律指出:系统中物体的平均数量等于物体离开系统的平均速率和每个物体在系统中停留的平均实践的乘积。(冰球如果物体离开和进入系统的总体出入流是平衡的,那么离开速率也就是进入速率)
eg:在我的地下室有150箱酒,我每年喝掉25箱并买入25箱,那么每箱酒保存的时间是多长?
Little定律:150箱 / 25箱/年=6年
Little定律和流平衡的原理证明多用户系统中的响应时间公式。
假定平均思考时间为 z 的 n 个用户同时登录到响应时间为 r 的任意系统中,每个用户周期都由思考和等待系统响应两个阶段组成,因此整个元素统(包括用户和计算机系统)中的作业总数固定为 n。如果切断系统输出到用户的路径,你就会发现元素统的平均负荷为 n 、平均响应时间为 z+r 而吞吐量为x(用每个时间单位处理的作业数来度量)。Little定律告诉我们:n = x *(z+r),得 r = n/x-z
任何事都应尽量简单,但不宜过于简单
算法设计技术
- 保存状态,避免重复计算
- 将信息预处理至数据结构中
- 分治算法
- 扫描算法
- 累加数据
- 下界
代码调优
代码调优的最重要原理就是尽量少用它
-
效率的角色:软件的其他许多性质和效率一样重要,是指更重要,不成熟的优化是大量编程灾害的根源,它会危及程序的正确性、功能性以及可维护性。当可能的危害影响较大时,请考虑适当将效率放一放
-
度量工具:当效率很重要时,第一步就是对系统进行性能监视,以确定其运行时间的分布状况。对程序进行性能监视的结果通常类似;多数的时间都消耗在少量的热点代码上,而余下的代码则很少执行。性能监视可以帮助我们找到程序中的关键区域;对于其他区域,我们遵循有名的格言“没有坏的话就不要修”
-
设计层面:效率问题可以由多种方法来解决。只有在确信没有更好的解决方案时才考虑进行代码调优。
-
双刃剑:使用if语句替换模运算有时可以使速度加倍,有时候却对运行时间没有什么影响,将函数转换为宏可以使某个函数速度加倍,却也可能使另一个函数的速度减慢为原来的万分之一。(玩火者,小心自焚)
节省空间
关键在于简单
简单性可以衍生出功能性、健壮性以及速度和空间。
数据空间技术
- 不存储,重新计算:如果我们在需要某一给定对象的任何时候,都对其进行重新计算而不保存,那么保存该对象所需的空间就可以急剧地减少
- 稀疏数据结构:将一个参差不齐的三维表保存在一个二维数组中,从而节省了空间,如果我们使用的关键字将作为索引存储到表中,那么就不需要存储关键字本身,而只需要存储其相关的属性,例如它被查看的次数。
- 使用指针来共享大型对象(如长文本字符串)可以消除存储同一对象的众多副本所需的开销,但是程序员在修改共享对象时,必须小心谨慎地确保该对象的所有拥有者都希望被修改。
- 数据压缩:信息理论告诉我们,可以通过压缩的方式对对象进行编码,以减少存储空间
- 分配策略:有时空间的使用方式比使用量更重要(动态分配和可变长记录)
动态分配:只有在需要的时候才进行分配,可变长记录的策略是说,当确实需要请求某样东西时,我们应该根据需要量来请求。
- 垃圾回收:对废弃的存储空间进行回收再利用,从而那些不用的位㐇可以重新使用了。
上一篇:编程珠玑第一部分基础
更多推荐
编程珠玑第二部分性能
发布评论