CSAPP--优化程序性能
一.编写高效的程序:
1.选择合适的算法和数据结构。
2.编写出编译器能够有效优化以转换为高效可执行的源代码。
3.并行计算。当然重点还是第一个,良好的算法和数据结构大大减小了程序的时间复杂度。
二.优化编译器的局限性:
编译器可以对程序进行不同程序的优化,在终端中,编译时添加命令行选项-O1,-O2等等可以进行不同级别的优化,这样虽然提高了程序的性能,但是也加大了程序的规模。
首先要进行安全的优化,在这个例子中:
void twiddle1(int *xp,int *yp)
{
*xp+=*yp;
*xp+=*yp
}
void twiddle2(int *xp,int *yp)
{
*xp+=**yp;
}
编译器是不会将twiddle1优化成twiddle2的,虽然twiddle2只需要三次访问内存,而twiddle1需要6次。编译器需要考虑xp和yp相等的情况,这样两个函数的结果就会不同,两个指针可能只想同一个存储器位置的情况成为存储器别名使用。第二个妨碍优化的因素是函数调用,f()+f()+f()+f()和4*f()总会有点区别的,因为执行一次f()有可能就修改了全局变量的值,在下次调用时环境就可能不同,属于函数的副作用。
三.理解现代处理器
考虑利用处理器的微体结构的优化,完成一些基本的优化。
1.整体操作(ICU,EU)。
2.分支预测:现代处理器中采用了分支预测的技术,处理器在执行某条指令序列时会预测下一条指令的位置,是否选择分支,预测分支的目标地址,投机执行,如果预测错误,将状态重新设置到分支点的状态。
3.功能单元的特性:延迟,运算所需要的总时间;发射时间,两个连续的同类型运算之间需要的最小时钟周期数。
4.关键路径:这是执行一组机器指令所需要时钟周期数的一个下界,循环运算中,有些数据是不能同时并行运算的,他们必须一个接一个的运算,因为后一次运算依赖于前一次
计算的结果。所以该计算流程就是该循环中的关节数据流。该数据流处理的必须用时,就成为了优化的界限。
四.程序级的优化
每元素的周期数,Cycles Per Element 来表示程序的性能。
1.代码移动。比如将循环中计算结果不会改变的计算移出,减少计算。
2.减少过程的调用。
3.消除不必要的存储器引用。减少对存储器的访问,比如 *dest=*dest*a[i]中,每次循环都要进行一次存储器的访存。可通过先赋值给一个局部变量,最后再赋值给*dest。
4.循环展开。通过增加每次迭代的计算的元素的数量,减少循环的迭代次数。展开的次数越高,CPE 性能越接近1。他减少了不直接有助于程序结果的操作的数量,比如循环索引的计算和条件分支,其次减少了整个计算中关键路径上的操作数量。
5.提高并行性。多个积累变量,通过多个变量计算最后再合并以提高程序性能。重新结合变换,对于一个计算表达式中,两个连乘,我们可以使用括号,让后一次乘法先进行,然后再进行前一次乘法。这样做的能提升程序速度的原理在于,如果使用顺序乘法,第一次乘法结果与第二次乘法结果都会保存在同一个寄存器中,无形中增长了关键路径。通过该优化方法,能使得关键路径变短。
其实说这么多,最好的还是选择个合适数据结构和算法来实现程序的优化,对于大数据,可能需要的这些优化措施多一些。
CSAPP--优化程序性能的更多相关文章
- CSAPP 5 - 优化程序性能
CSAPP 5 - 优化程序性能 1. 概述 首当其冲的,还是要编写出好的算法和数据结构,优化内部结构 其次才是编写出能让编译器 易优化的,高效的可执行代码.这点在特定的机器上可能有着特定的不同的优化 ...
- 优化程序性能(CSAPP)
[前言]虽然现在没有接触过大型项目,但是工作了会注重性能.学习一下,应该能更好更快的理解别人写的经典优化的代码.结合CSAPP和自己的理解,总结一下. 一.程序优化综述 1.高效程序的特点 (1)适当 ...
- C# ASP.NET 优化程序性能、降低内存使用、提高程序运行速度
首先纪念一下今天的股票大跌抓个图,虽然我自己损失不是很大,但是应该大多人都损失不小.也可能有人会继续跳楼,也可能是股市一个新的转折点来了. 接着还是重点关注自己写代码优化的主题吧.软件系统当访问量不大 ...
- web应用程序性能优化
web应用程序基本上都是在浏览器地址栏输入一段网站,然后进入,最后浏览器显示你想要的东西. 这就是用户所能体会到的东西.那作为程序员我们看到了什么呢? 一次HTTP 请求主要的流程是: 1.DNS服务 ...
- iOS 程序性能优化
前言 转载自:http://www.samirchen.com/ios-performance-optimization/ 程序性能优化不应该是一件放在功能完成之后的事,对性能的概念应该从我们一开始写 ...
- C++ 应用程序性能优化
C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...
- java程序性能优化
一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...
- Java程序性能优化——让你的java程序更快、更稳定
1.Java性能调优概述 1.1.Web服务器,响应时间.吞吐量是两个重要的性能参数. 1.2.程序性能的几个表现: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:分配是否合理,是否过多 ...
- Java程序性能优化技巧
Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...
- 《Java程序性能优化:让你的Java程序更快、更稳定》
Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧
随机推荐
- tigerVNC远程桌面,跨内网
tigerVNC的简单使用教程(CentOS的远程桌面连接) 1.环境和软件准备 (1) CentOS 6.5下 [root@localhost ~]$ yum install tigervnc (2 ...
- AngularJs中文社区学习资料
AngularJs中文社区学习资料,供学习: http://angularjs.cn/tag/AngularJS
- IntelliJ IDEA创建web项目及异常问题解决
IDEA配置Tomcat: 1.下载Tomcat,本次使用的是apache-tomcat-6.0.43 2.IDEA配置Tomcat 在idea中的Settings(Ctrl+Alt+s)(或者点击图 ...
- hand第四次考核
使用Spring与Mybatis技术实现下要求: (2分)1,Spring的配置文件名称为ApplicationContext.xml (2分)2,在ApplicationContext.xml中配置 ...
- 认识ptrace函数
认识ptrace函数 这是man对于ptrace这个系统调用的解释 http://man7.org/linux/man-pages/man2/ptrace.2.html #include <sy ...
- ionic框架前端生产环境的简单部署
1. 效果对比 1.1 开发环境 css+js+lib文件大小为好多M :) 1.2 部署环境(生产环境) css+js+lib文件大小约为800K 文件大小:好多M–>800K(多少自己试下) ...
- @SuppressWarnings(unchecked)作用解释
解释一: 屏蔽某些编译时的警告信息 在强制类型转换的时候编译器会给出警告 加上 程序代码 @SuppressWarnings("unchecked") 就不会警告了 解释二: 注释 ...
- Qt的Graphics-View框架和OpenGL结合详解
Qt的Graphics-View框架和OpenGL结合详解 演示程序下载地址:这里 程序源代码下载地址:这里 这是一篇纯技术文,介绍了这一个月来我抽时间研究的成果. Qt中有一个非常炫的例子:Boxe ...
- android键盘事件
在main.xml文件中代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...
- 大数据笔记09:大数据之Hadoop的HDFS使用
1. HDFS使用: HDFS内部中提供了Shell接口,所以我们可以以命令行的形式操作HDFS