<<代码优化:有效使用内存>>代码优化建议:
    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 利用单词并发:充分使用基本计算机体系结构的数据总线宽度来计算昂贵的表达式。

转载于:https://www.cnblogs.com/jimcsharp/p/5577261.html

[摘录]代码优化规则相关推荐

  1. Unity性能优化要点分析(二) 渲染优化技术

    本章摘录自UnityShader入门精要的第16章内容. 移动平台的特点 移动平台的GPU架构有很大不同,由于芯片架构的不同,一些游戏往往需要针对不同的芯片发布不同的版本,以便对每种芯片进行更有针对性 ...

  2. 笔记︱范数正则化L0、L1、L2-岭回归Lasso回归(稀疏与特征工程)

    机器学习中的范数规则化之(一)L0.L1与L2范数 博客的学习笔记,对一些要点进行摘录.规则化也有其他名称,比如统计学术中比较多的叫做增加惩罚项:还有现在比较多的正则化. -------------- ...

  3. 第16章 Unity中的渲染优化技术

    程序优化的第一条准则: 不要优化.程序优化的第二条准则(仅针对专家! 〉: 不要优化. 一一Michael A. Jackson 在进行程序优化的时候,人们经常会引用英国的计算机科学家Michael ...

  4. 【原创】三星、镁光、海力士内存颗粒命名规则摘录

  5. 编译器设计-代码优化

    编译器设计-代码优化 Compiler Design - Code Optimization 优化是一种程序转换技术,它试图通过使代码消耗更少的资源(如CPU.内存)来改进代码,并提供高速. 在优化中 ...

  6. 《OpenMP编译原理及实现技术》摘录

    内容摘自<OpenMP编译原理及实现技术>第2章 代码测试环境:Windows7 64bit, VS2010, 4核机. 可以说OpenMP制导指令将C语言扩展为一个并行语言,但OpenM ...

  7. 《Linus Torvalds 自传》摘录

    除了程序员,大概很少人知道Linux操作系统.它的发明者Linus Torvalds,知道的人就更少了.他本人也很低调,深居简出,很少出席公众场合或接受媒体采访,通常只在专业开发者的邮件列表中发言.提 ...

  8. Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结

    2019独角兽企业重金招聘Python工程师标准>>> 用了这么长时间,发现自己竟然不知道utf_bin和utf_general_ci这两者到底有什么区别.. ci是 case in ...

  9. 第十四届智能车竞赛规则浅聊

    以下文字摘自于ZNCZZ论坛,目的是用于交流.摘录未做任何删减,文中观点为作者的观点:文中内嵌商业推广信息,请大家自行判断. 这不是魔术,只是看到的是三维世界在二维视网膜上的投影 距离卓老师微信公众号 ...

最新文章

  1. TOJ4537: n阶行列式
  2. leetcode 8. 字符串转换整数 (atoi)
  3. TortoiseGit清除账号密码
  4. 机器学习与数学分析(二)
  5. 几款不错的VisualStudio2010插件
  6. 密钥登陆Linux服务器
  7. 浙大1202 zoj1202
  8. iOS 将16进制颜色转换成UIColor
  9. Cheapest Palindrome POJ - 3280(动态规划*)
  10. VMware vSphere 6.7主机与虚拟机高级管理
  11. jsp中forward与sendRedirect的区别
  12. c++头文件被c语言调用需要注意什么_嵌入式C语言之模块化编程
  13. 说“诡”道“诈”——解读“兵者,诡道也”+——文献综述
  14. 自制 kazzo 烧录器
  15. 【工作感悟】在一家普通互联网公司实习四个月的总结和感想
  16. 电商api数据接口,淘宝item_cat_get,淘宝API接口分类!!!
  17. Linux系统的安装
  18. 【编程题】【Scratch二级】2021.12 绘制多边形
  19. C51 基本函数、中断函数和库函数的详解
  20. (翻译)“用户名或电子邮件地址”字段能降低账号登录锁定

热门文章

  1. docker :open /var/lib/docker/tmp/GetImageBlob318829910: no such file or directory异常解决
  2. 记录win10快捷键
  3. canvas java 上传截图_在Vue项目中使用html2canvas生成页面截图并上传
  4. Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)
  5. PyTorch学习笔记——softmax和log_softmax的区别、CrossEntropyLoss() 与 NLLLoss() 的区别、log似然代价函数...
  6. 基于TensorRT的BERT实时自然语言理解(上)
  7. 空间点像素索引(二)
  8. Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读
  9. Android RecyclerView(和SnapHelper) 实现类似ViewPager的效果
  10. Ubuntu系统打开终端的方法