一.编写高效的程序:

  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--优化程序性能的更多相关文章

  1. CSAPP 5 - 优化程序性能

    CSAPP 5 - 优化程序性能 1. 概述 首当其冲的,还是要编写出好的算法和数据结构,优化内部结构 其次才是编写出能让编译器 易优化的,高效的可执行代码.这点在特定的机器上可能有着特定的不同的优化 ...

  2. 优化程序性能(CSAPP)

    [前言]虽然现在没有接触过大型项目,但是工作了会注重性能.学习一下,应该能更好更快的理解别人写的经典优化的代码.结合CSAPP和自己的理解,总结一下. 一.程序优化综述 1.高效程序的特点 (1)适当 ...

  3. C# ASP.NET 优化程序性能、降低内存使用、提高程序运行速度

    首先纪念一下今天的股票大跌抓个图,虽然我自己损失不是很大,但是应该大多人都损失不小.也可能有人会继续跳楼,也可能是股市一个新的转折点来了. 接着还是重点关注自己写代码优化的主题吧.软件系统当访问量不大 ...

  4. web应用程序性能优化

    web应用程序基本上都是在浏览器地址栏输入一段网站,然后进入,最后浏览器显示你想要的东西. 这就是用户所能体会到的东西.那作为程序员我们看到了什么呢? 一次HTTP 请求主要的流程是: 1.DNS服务 ...

  5. iOS 程序性能优化

    前言 转载自:http://www.samirchen.com/ios-performance-optimization/ 程序性能优化不应该是一件放在功能完成之后的事,对性能的概念应该从我们一开始写 ...

  6. C++ 应用程序性能优化

    C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...

  7. java程序性能优化

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

  8. Java程序性能优化——让你的java程序更快、更稳定

    1.Java性能调优概述 1.1.Web服务器,响应时间.吞吐量是两个重要的性能参数. 1.2.程序性能的几个表现: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:分配是否合理,是否过多 ...

  9. Java程序性能优化技巧

    Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...

  10. 《Java程序性能优化:让你的Java程序更快、更稳定》

    Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧

随机推荐

  1. 转:fopen与open可以转换吗

    绝对不可以.fopen是C运行库级别的函数,而open是system call的wrapper routine.fopen返回FILE *的指针,这个结构本身维护着一些关于这个文件的信息,而open返 ...

  2. Vector3.Dot 与Vector3.Cross

    Vector3.Dot(点积) : 点积的计算方式为:  a·b=|a|·|b|cos<a,b>; 其中<a,b>和<b,a> 夹角不分顺序; 物理学中点积用来计算 ...

  3. c++学习笔记和思考

    1.内置类型:int float等编程语言自己定义的类型 类类型:自己声明的类,即是对对象的抽象 2.const double *cp 表示cp是指向一个const类型double类型数据的指针,而非 ...

  4. uva 10026 Problem C: Edit Step Ladders

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. MFC关于VS内存释放的定位

    全部在App中完成 1.在 App.h 头文件声明 #ifdef _DEBUGprotected:      CMemoryState m_msOld, m_msNew, m_msDiff;#endi ...

  6. Linux下静态编译Qt

    Qt采用编译的方式安装的时候,配置中默认的编译方式是动态编译的,但是有时候你编写的程序要发布出去,带很多动态库文件是很繁琐的,此时就需要静态编译你的程序,Qt要实现静态编译必须库文件也是静态编译的,所 ...

  7. java中Runnable接口含义

    Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口. Runnable接口非常简单,就定义了一个方法run(),继承Runnable并实现这个 方法就可以实现多线程了,但是 ...

  8. ubuntu安装使用kdevelop

    vim是好用,但是有时候操作不那么人性化,用一个ide可能感觉比较好,ubuntu下面比较好的c/c++ ide出名的有kdevelop,Qt等. kdevelop安装: sudo apt-get u ...

  9. BZOJ3403: [Usaco2009 Open]Cow Line 直线上的牛

    3403: [Usaco2009 Open]Cow Line 直线上的牛 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 48  Solved: 41[S ...

  10. 【转】Microsoft visio 2013 pro 图文激活破解教程

    原文网址:http://jingyan.baidu.com/article/db55b609ab0e1f4ba30a2ff0.html Microsoft visio 2013 pro 假如您使用Mi ...