解释程序 。在图形程序中,我们用4字节的解释程序命令替换了一长行的程序文本 。描述了一个用于格式信函编程的解释程序,尽管它的主要目的是使编程和维护更加简单,但是它同时也减少了程序的空间 。
Kernighan和Pike在他们Practice of Programming一书介绍了“解释程序、编译器和虚拟机” 。他们列举了许多例子来支撑他们的结论:
“虚拟机是以前的一个有趣想法,最近借助于Java和Java虚拟机(Java Virtual Machine, JVM)又重新流行起来了;对于高级语言编写的程序来说,它们很容易提供可移植的、高效的表示 。”
翻译成机器语言 。在节省空间方面,大多数程序员都较少控制的是将源语言转换成机器语言 。对编译器进行一些微小更改可以将Unix系统早期版本的代码空间减少5个百分点 。
作为最后的手段,程序员可能会考虑到将大型系统中的关键部分用汇编语言进行手工编码 。这个高开销、易出错的过程仅能带来一点点好处;不过,该方法还是常常用于一些内存宝贵的系统,比如数字信号处理器 。
Apple Macintosh于1984年诞生,当时是一款令人称奇的机器 。这款小小的计算机(128 KB RAM)具有令人震惊的用户界面和功能强大的软件集 。设计小组预期将制造好几百万台这样的机器,并且只提供64 KB的ROM 。
通过谨慎的函数定义(包括泛化运算符、归并函数和删除功能特性)并使用汇编语言手工编码整个ROM程序,该小组将令人难以置信的众多系统功能集成到了一个极微小的ROM上 。
他们估计那些经过极度调优的代码(具有谨慎的寄存器分配和指令选择)的规模只有从高级语言编译过来的等价代码的一半(尽管那时编译器已经有了很大的改进) 。紧凑的汇编代码运行起来也非常快 。
循环法则将代码移出循环 。与其在循环的每次迭代时都执行一次某种计算,不如将其移到循环体外,只计算一次 。
合并测试条件 。高效的内循环应该包含尽量少的测试条件,最好只有一个 。因此,程序员应尽量用一些退出条件来模拟循环的其他退出条件 。
循环展开 。循环展开可以减少修改循环下标的开销,对于避免管道延迟、减少分支以及增加指令级的并行性也都很有帮助 。
删除赋值 。如果内循环中很多开销来自普通的赋值,通常可以通过重复代码并修改变量的使用来删除这些赋值 。具体说来,删除赋值i = j后,后续的代码必须将j视为i 。
消除无条件分支 。快速的循环中不应该包含无条件分支 。通过“旋转”循环,在底部加上一个条件分支,能够消除循环结束处的无条件分支 。该操作通常由优化的编译器完成 。
循环合并 。如果两个相邻的循环作用在同一组元素上,那么可以合并其运算部分,仅使用一组循环控制操作 。
逻辑法则利用等价的代数表达式 。如果逻辑表达式的求值开销太大,就将其替换为开销较小的等价代数表达式 。
短路单调函数 。如果我们想测试几个变量的单调非递减函数是否超过了某个特定的阈值,那么一旦达到这个阈值就不再需要计算任何变量了 。该法则的一个更成熟的应用就是,一旦达到了循环的目的就退出循环 。
对测试条件重新排序 。在组织逻辑测试的时候,应该将低开销的、经常成功的测试放在高开销的、很少成功的测试前面 。
预先计算逻辑函数 。在比较小的有限域上,可以用查表来取代逻辑函数 。
消除布尔变量 。我们可以用if – else语句来取代对布尔变量v的赋值,从而消除程序中的布尔变量 。在该if – else语句中,一个分支表示v为真的情况,另一个分支表示v为假的情况 。
- 50岁的人除了跑步快走 老年人的性功能如何维持
- 血氧仪|1380元血氧仪成本仅几十块是真的吗 如何看待血氧仪涨价
- 烤箱|如何用烤箱烤红薯 烤红薯注意事项
- 中医如何做到两者兼顾养生调理 阴虚和阳虚同时存在吃什么药
- 老大|老大就该让着弟弟妹妹吗 生二胎如何考虑大宝的感受
- 甲状腺疾病该如何治疗 艾灸图片高清图片大全
- 中医是如何治疗传染病的 八个偏方治好尿毒症
- 如何看一块石头里面有没有玉 怎么判断是玉还是石头
- 中医也无法根治糖尿病吗 糖尿病如何治疗哪种好用
- 菜板|菜板发霉怎么办 如何清洁砧板霉菌