程序性能优化
2016-07-29 00:00
155 查看
设计层面的性能优化:
1、问题定义:良好的问题定义可以避免用户对问题需求的过高估计。问题定义和程序效率之间具有复杂的相互影响。
2、系统结构分解:将大型系统分解成模块,也许是决定其性能的最重要的单个因素。在构建出整个系统的框架之后,设计者需要完成简单的粗略估算,以确保程序的性能在正确的范围之内。
3、算法调优和数据结构重组:通过运用更好的算法设计技术和数据结构在达到性能优化。
4、代码调优:例如使用汇编语言来重新编写一些核心的占主要运行时间的函数。
5、系统软件:有时改变系统所基于的软件比改变系统本身更容易。如更换数据库、启动所有的编译器优化项。
6、硬件:如通过在同一处理器或多处理器上提高时钟速度来实现加速。声卡、显卡和其他的卡将中央处理器的工作转移到小型的快速的专用处理器上。
粗略估算的技巧:
(1)两个答案比一个答案好:做多次估算,然后进行比较。
(2)快速检验:如量纲检验法。
(3)72法则:假设以年利率r%投资一笔钱y年,如果r*y=32,则你的投资差不多会翻倍。这通过用于估算指数过程的增长。
(4)实践:估算技巧只能通过实践、试验等来提高。
(5)简单法则:总开销等于每个单元的开销乘以单元的个数。
(6)Little定律:系统中物体的平均数量等于物体离开系统的平均速率和每个物体在系统中停留的平均时间的乘积。并且如果物体离开和进入系统的总体出入流是平衡的,那么离开速率也就是进入速率。
代码调优法则:
(1)节省时间:修改数据结构(增加一些额外信息)、存储预先计算好的结果、高速缓存、惰性求值、建立索引。
(2)节省空间:不存储而是重新计算、稀疏数据结构、数据压缩、分配策略(使用动态分配而不是静态分配)、垃圾回收、共享空间技术、抽离共同的代码并封装成函数、用解释程序替换长的程序文本、翻译成机器语言。
(3)循环法则:将代码移出循环、合并测试条件、在数据结构边界上放哨兵以减少测试、展开循环、删除赋值、消除无条件分支、循环合并。
(4)逻辑法则:利用等价的代数表达式、短路单调函数、对测试条件重新排序、预先计算逻辑函数、消除布尔变量。
(5)过程法则:打破函数层次(使用宏或内联来替换函数)、高效处理常见情况、使用多个程序来协同完成任务、将递归重写为迭代、充分利用底层硬件的并行性。
(6)表达式法则:编译时初始化、利用等价的代数表达式(如加法替代乘法、移位替代乘除法、if语句替代取模运算符%)、消除公共子表达式、成对计算、利用计算机字的并行性。
1、问题定义:良好的问题定义可以避免用户对问题需求的过高估计。问题定义和程序效率之间具有复杂的相互影响。
2、系统结构分解:将大型系统分解成模块,也许是决定其性能的最重要的单个因素。在构建出整个系统的框架之后,设计者需要完成简单的粗略估算,以确保程序的性能在正确的范围之内。
3、算法调优和数据结构重组:通过运用更好的算法设计技术和数据结构在达到性能优化。
4、代码调优:例如使用汇编语言来重新编写一些核心的占主要运行时间的函数。
5、系统软件:有时改变系统所基于的软件比改变系统本身更容易。如更换数据库、启动所有的编译器优化项。
6、硬件:如通过在同一处理器或多处理器上提高时钟速度来实现加速。声卡、显卡和其他的卡将中央处理器的工作转移到小型的快速的专用处理器上。
粗略估算的技巧:
(1)两个答案比一个答案好:做多次估算,然后进行比较。
(2)快速检验:如量纲检验法。
(3)72法则:假设以年利率r%投资一笔钱y年,如果r*y=32,则你的投资差不多会翻倍。这通过用于估算指数过程的增长。
(4)实践:估算技巧只能通过实践、试验等来提高。
(5)简单法则:总开销等于每个单元的开销乘以单元的个数。
(6)Little定律:系统中物体的平均数量等于物体离开系统的平均速率和每个物体在系统中停留的平均时间的乘积。并且如果物体离开和进入系统的总体出入流是平衡的,那么离开速率也就是进入速率。
代码调优法则:
(1)节省时间:修改数据结构(增加一些额外信息)、存储预先计算好的结果、高速缓存、惰性求值、建立索引。
(2)节省空间:不存储而是重新计算、稀疏数据结构、数据压缩、分配策略(使用动态分配而不是静态分配)、垃圾回收、共享空间技术、抽离共同的代码并封装成函数、用解释程序替换长的程序文本、翻译成机器语言。
(3)循环法则:将代码移出循环、合并测试条件、在数据结构边界上放哨兵以减少测试、展开循环、删除赋值、消除无条件分支、循环合并。
(4)逻辑法则:利用等价的代数表达式、短路单调函数、对测试条件重新排序、预先计算逻辑函数、消除布尔变量。
(5)过程法则:打破函数层次(使用宏或内联来替换函数)、高效处理常见情况、使用多个程序来协同完成任务、将递归重写为迭代、充分利用底层硬件的并行性。
(6)表达式法则:编译时初始化、利用等价的代数表达式(如加法替代乘法、移位替代乘除法、if语句替代取模运算符%)、消除公共子表达式、成对计算、利用计算机字的并行性。
相关文章推荐
- 前后端分离的思考与实践(1)
- 我的C++实践(10):智能指针
- 我的面试宝典(1):给自己定位-霍兰德职业测试
- 面试题
- Linux系统管理实践(12):Syslog系统日志配置
- Linux 多线程模板
- Linux进程调度(1):CFS调度器的设计框架
- 我的C++实践(18):多态的双重分派实现
- C++ Primer学习系列(4):关联容器/泛型算法/类
- dbm数据库源代码分析(10):gdbmstore.c、gdbmfetch.c和gdbmdelete.c
- 从A点开始到B点通过最短的路一共有多少条
- 重新解析REST Service
- dbm数据库源代码分析(14):ndbm部分(续)
- dbm数据库源代码分析(5):gdbmopen.c和gdbmclose.c
- 知乎圆桌论坛:设计就是生产力
- 排序算法的实现
- C++ Primer学习系列(3):函数/标准IO库/顺序容器
- 贪心算法
- Python中的高级设计模式
- 高吞吐低延迟Java应用的垃圾回收优化