[摘录]代码优化规则

<<代码优化:有效使用内存>>代码优化建议:
    1. 展开读取内存的循环
    2. 消除数据相关性

        如果请求的RAM单元存在地址数据相关性(也就是说,一个单元含有另一个单元的地址),那么CPU不能并行地处理它们,而在得到地址之前必须等待。消除数据相关性可以提高指令并发度。
    3. 同时向存储控制器发送多个查询
    4. 请求按不少于32个字节的增量方式读取数据
    在
于内存进行数据交换的过程中所用的最小数据单位至少是32byte,所以处理速度与处理增量成反比。当增量以1(字节、字或双字)读取内存时,由一半的加
载单元永远不会访问。当以增量4(字节、字或双字)读取内存时,仅仅有25%的加载单元会用到,其它的加载单元不会起任何作用。可见,内存中的数据必须尽
可能紧密地存放在一起。
    5. 使用所有经历请求的页面
    6. 以一种排除了对相同DRAM页面进行选取的增量方式来处理数据
    7. 对齐数据源地址
    8. 组合执行存取内存的代码
    9. 成组进行读写操作
    10. 仅仅在必要时才放问内存
    11. 从不针对特定平台优化程序。

<<Programming Pearls(Second Edition)>>代码优化规则:

1. 用空间换取时间规则
    1.1 扩展数据结构:通常,通过给结构增加其他信息或改变结构内部的信息让它访问的更快能够减少对数据的常用操作所需的时间。
    1.2 存储预先计算好的结果:计算函数一次,然后存储计算结果能够减少昂贵函数的重新计算所需要的成本。以后对该函数的请求就只需要通过查表来完成,而不需要重新计算该函数。
    1.3 高速缓存:必须降低经常访问的数据的访问成本。
    1.4 延迟计算法:除非需要,否则该策略永远不会计算某个元素,这样可以避免计算不必要的元素。

2. 用时间换取空间规则
    2.1 压缩:密集存储表示能够通过增加存储和检索所需的时间来降低存储成本。
    2.2 解释程序:通常,使用解释程序能够减少表示程序所需的空间,解释程序压缩表示相同的操作序列。

3. 循环规则
    3.1 将代码移出循环:最好不要在循环的每次迭代中都执行相同的操作,而是将它放在循环外部,仅仅执行一次。
    3.2 合并测试条件:高效的内部循环一个尽量少包含测试条件,最好只有一个。因此,程序员应该尽量使用其他退出条件模拟循环的一些推出条件。哨兵是该规则最常见的应用:在数据结构的边界上放一个哨兵来测试是否已经遍历完整个结构。
    3.3 循环展开:展开循环能够消除循环中修改循环下标的成本,同时一能避免管道时延、减少分支,并增加指令级并发。
    3.4 传输驱动的循环展开:如果在普通的赋值中,使用了一个成本很高的内部循环,那么通常通过改变所使用的变量能够消除这些赋值。例如:删除赋值i=就,后面的代码必须将j视为i。
    3.5 消除无条件分支:在快速的循环中不应该包含无条件分支。通过“旋转”循环,在底部加上一个条件分支,能够消除循环结束处的无条件分支。
    3.6 循环合并:如果两个邻近的循环操作作用在同一个元素集上,那么最好合并这两个操作部分,仅仅使用一个循环控制操作。

4. 逻辑规则
    4.1 利用袋鼠恒等式:
如果逻辑表达式的计算非常昂贵,就使用比较廉价的代数等式表达式来替换。
    4.2 简化的单调函数:测试几个部落的单调非递减函数是不是超过了特定的阀值,一旦达到了这个阀值就不需要计算任何变量。该规则的一个更加复杂的应用就是一旦达到了循环的目的就退出循环。
    4.3 重新排序测试:在组织逻辑测试的时候,应该将廉价的经常成功的测试放在昂贵的很少成功的测试前面。
    4.4 预计算逻辑函数:可以使用表示域的表的查找替代一个小的有限域中的逻辑函数。
    4.5 消除布尔变量:我们可以通过用if-else语句替代对布尔变量的v赋值来消除布尔变量,在if-else语句中的一个分支表示v为真的情况,其它的表示v为假的情况。

5. 过程规则
    5.1 压缩函数层次:
通常,重写函数并绑定过去的变量能够减少调用本身(非递归)函数集合元素的运行时间。
    5.2 利用常用情况:一个组织函数正确处理所以情况并高效处理普通情况。
    5.3 协同程序:通常,使用协同程序能够将multiple-pass算法转换为single-pass算法。
    5.4 递归函数变化:通过下面的转换能够减少递归函数的运行时间:将递归重写为迭代,通过使用栈来将递归转换为迭代。如果函数的最后一步是递归调用自身,那么使用一个到其第一条语句的分支来替换该调用,这通常叫做尾递归。
    5.5 并发:在基本的硬件条件下,构建的程序应该能够尽可能地利用并发。

6. 表示规则
    6.1 初始化编译时间:
在程序执行之前,尽可能初始化变量。
    6.2 利用代数恒等式:如果表达式的计算非常昂贵,就应使用开销较小的代数恒等表达式替换它。通常我们可以是向左或向右移位来实现幂的乘或除;尽量减少数组元素上的迭代循环,使用加法替代乘法。
    6.3 消除通用子表达式:如果连续两次计算了同一个表达式,并且它的所有变量都没有任何改动,那么就应该避免第二次计算,只需要排序第一次计算结果并将它用于第二次计算中。现在的编译器一般都能消除不包含函数调用的常用子表达式。
    6.4 配对计算:如果总是同时计算两个类似的表达式,那么就应该建立一个新的过程并将它们成对计算。
    6.5 利用单词并发:充分使用基本计算机体系结构的数据总线宽度来计算昂贵的表达式。

时间: 2024-11-06 03:36:29

[摘录]代码优化规则的相关文章

Drools源于规则引擎

一 前言 最早对Drools感兴趣,是起源于规则引擎.当时是希望能找一个开源工具来做一些规则的处理. 在官方网站上翻了半天资料,却发现Drools一直在强调它不只是一个简单的规则引擎,而是更多的引入工作流的概念.      之后最大的感触就是Drools牵涉到的东西比较多,甚至有一种依照Drools可以创造整个世界的感觉-- 这个世界本身不就是由各种规则/流程/事件构成的么? 这也是本文标题的由来. 以后会对Drools的各方面有一个比较深入的了解,因此这篇文章只是用来做简单的介绍,希望能在短时

[moka同学摘录]iptables防火墙规则的添加、删除、修改、保存

文章来源:http://www.splaybow.com/post/iptables-rule-add-delete-modify-save.html 本文介绍iptables这个Linux下最强大的防火墙工具,包括配置iptables三个链条的默认规则.添加iptables规则.修改规则.删除规则等. 一.查看规则集 iptables --list -n // 加一个-n以数字形式显示IP和端口,看起来更舒服 二.配置默认规则 iptables -P INPUT DROP  // 不允许进  

阅读摘录《javascript 高级程序设计》01

前言: 因为工作需要,所以开始主攻前台JS方面的技术.在以前的工作中,使用过这门脚本语言.但是都是比较凌乱的,用到什么学什么,只是为了实现业务,而去使用. 不会考虑到代码优化,封装对象等.今次特意借了这本<javascript 高级程序设计> ,在每个晚上抽出一个小时来看这本纸质书,系统的学习这门语言. 本文中摘录的都是一些在阅读中,感觉比较重要的信息.如果文中出现差错,欢迎园友拍砖. 摘录: 数据类型 undefined  使用var声明 但未对其初始化 Null null值 Boolean

前端代码优化(转)

所谓代码优化是指对程序代码进行等价(指不改变程序的运行结果)变换.程序代码可以是中间代码(如四元式代码),也可以是目标代码.等价的含义是使得变换后的代码运行结果与变换前代码运行结果相同.优化的含义是最终生成的目标代码短(运行时间更短.占用空间更小),时空效率优化.原则上,优化可以再编译的各个阶段进行,但最主要的一类是对中间代码进行优化,这类优化不依赖于具体的计算机. 要点: 一. 尽量采用div+css布局您的页面,div+css布局的好处是让搜索引擎爬虫能够更顺利的.更快的.更友好的爬完您的页

java代码优化总结1

java代码优化 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率.本文讨论的主要是如何提高代码的效率. 在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身.养成好的代码编写习惯非常重要,比如正确地.巧妙地运用 java.lang.String类和java.util.Vector类,它能够显著地提高程序的性能.下面我们就来具体地分析一下这方面的问题

PHP代码优化

1 代码优化 1 尽量静态化 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的效率主要区别在内存:静态方法在程序开始时生成内存,实例方法(非静态方法)在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例再调用,静态速度很快,但是多了会占内存. 任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同.静态

《正则表达式》知识点汇总摘录

开园一个月了,但一直没有抽出多少时间,就算有时间,也不知道怎么组织语言记(不是写,是记,写是一个创造的过程,像我这等程序猿,猿嘴吐不出象牙!)点东西!翻翻过去手头整理的一些知识点杂记,然后再结合网上的一些,今天对正则表达式在做一个个人的知识汇总摘录吧!程序员都是共产主义者,一点不假!大部分时候我们只是互联网的搬运工,堆砌者(扯远了,当然成为互联网创造者一直使我们的目标!). 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串&quo

《“十三五”国家信息化规划》涉及网络与信息安全的内容摘录

就在今天(12月27日),国务院全文刊发了<"十三五"国家信息化规划>(参见:http://www.gov.cn/zhengce/content/2016-12/27/content_5153411.htm).在此摘录跟网络与信息安全相关的内容如下: [注:我最关注的几点是(信息量太大!)] 构建关键信息基础设施安全保障体系.实施网络安全审查制度,防范重要信息技术产品和服务网络安全风险.建立国家关键信息基础设施目录,制定关于国家关键信息基础设施保护的指导性文件,进一步明确关

【转】Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结

Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_general_ci而不是utf8_unicode_ci呢? 用了这么长时间,发现自己竟然不知道utf_bin和utf_general_ci这两者到底有什么区别..ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的;bin 是二进制