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程序更快.更稳定, 卓越网更便宜,不错的书吧
随机推荐
- Linux下根据进程的名字杀死进程
以前是写了一个bash,通过ps,grep 和awk配合搜索PID再kill掉进程.果然以前傻,不知道解决问题之前先google,原来直接就有相关的pkill -f "process_nam ...
- git设置过滤忽略的文件或文件夹
我们一般向代码仓库提交项目的时候,一般需要忽略编译生成的中间文件以及文件夹的提交,因为它们是无用的,而且也会占用仓库的空间.一般只用提交.pro,.sln,makefile,程序源文件等编译必须用到的 ...
- android中对线程池的理解与使用
前段时间有幸接到腾讯上海分公司的 Android开发面试,虽然最后一轮被毙了.但还是得总结一下自己在android开发中的一些盲点,最让我尴尬的是面试官问我几个android中线程池的使用与理解..哎 ...
- 【HDOJ】1104 Remainder
bfs. #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> ...
- 【转】在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持--不错
原文网址:http://www.cnblogs.com/ericsun/archive/2013/06/10/3130679.html 虚拟机我一直在用,不是说离不开Windows,而是有些时候一些应 ...
- HDU_2022——海选女主角
Problem Description potato老师虽然很喜欢教书,但是迫于生活压力,不得不想办法在业余时间挣点外快以养家糊口.“做什么比较挣钱呢?筛沙子没力气,看大门又不够帅...”potato ...
- 计蒜客 444 / xtuoj 1024 京东的物流路径(并查集+离线lca)或者 (点分治)
题意:一颗树,定义一条路径的权值等于路径的边权之和,需要求这颗树所有路径中权值的最大值 思路: 考虑到路径权值与点权的最值有关,而最值的问题通常可以通过排序就行处理,于是想到先把点权排序. 容易看出如 ...
- New Year Permutation(Floyd+并查集)
Description User ainta has a permutation p1, p2, ..., pn. As the New Year is coming, he wants to mak ...
- typedef与define的区别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错.例如:#define PI 3.1415 ...
- MapReduce优化一(改变切片大小和Shuffle过程Reduce占用堆大小)
/*为防止处理超大作业时超时,将io时间设为1小时 * <property> <name>dfs.datanode.soc ...