CSAPP 5 - 优化程序性能
CSAPP 5 - 优化程序性能
1. 概述
- 首当其冲的,还是要编写出好的算法和数据结构,优化内部结构
- 其次才是编写出能让编译器 易优化的,高效的可执行代码。这点在特定的机器上可能有着特定的不同的优化,但有一些基本的优化仍然是相同的。
- 消除不必要的工作,让代码消耗时间在期望执行的任务上。包括消除或减少函数调用、条件测试、内存引用;同时熟悉处理器如何工作,利用反汇编知道它究竟如何执行操作,从而调整程序获得最大的速度。
- 利用好处理器的指令级并行能力,同时执行多条指令
2. 利用好编译器自身优化
gcc 就提供了不同优化级别的执行操作,利用 -O1 -O2 -O3 对程序进行不同级别的编译器优化代码。gcc 也在不断的更新迭代,编译器自身也在越来越强大。
基本编码规范:(避免限制优化的因素,产生更高效的代码)
消除连续的函数调用;避免不必要的内存引用
3. 消除循环的低效率,内存调用等
展开循环,降低开销
实现指令级并行
用功能性代码重写条件操作,使得编译采用条件传送
for (i=0; i<len; i++)
if (s[i] >= 'A' && s[i]<= 'Z')
s[i] -= ('A' - 'a');
函数调用不断使用,极其低效
4. 理解现代处理器
现代处理器采用分支预测的技术,处理器会猜测是否会选择分支,同时还预测分支的目标地址。这就让true/false 很痛苦,因为一旦预测失败就会产生很大的代价。所以我们会尽可能的采用条件传送(conditional move),而不是条件控制转移。
条件控制转移:等待代码的条件结果,选择合适的路径
for (i=0;i<n;i++)
if(a[i]>b[i]){
long t = a[i];
a[i] = b[i];
b[i]=t;
}
条件传送:先将结果运行,再根据结果选择最终的结果值
for (i=0;i<n;i++)
if(a[i]>b[i]){
long min =a[i] < b[i] ? a[i] : b[i];
long max =a[i] < b[i] ? b[i] : a[i];
a[i] = min;
b[i] = max;
}
防止寄存器溢出
当并行度 p 超过可用寄存器的数量,编译器就会溢出,将一些临时变量放在内存中,会降低运行速度
5. 利用代码剖析程序,进行分析
Unix提供剖析程序GPROF可以进行代码剖析分析
代码剖析(Code profiling)
程序员在优化软件性能时要注意应尽量优化软件中被频繁调用的部分,这样才能对程序进行有效优化。使用真实的数据,精确的分析应用程序在时间上的花费的行为就成为_代码剖析_。现在几乎所有的开发平台都支持代码剖析,本文要介绍的是linux下针对c/c++的GNU的gprof代码剖析工具。
PS:gprof不只能对c/c++,还可对Pascal和Fortran 77进行代码剖析。
gprof
GNU gprof 是一款linux平台上的程序分析软件(unix也有prof)。借助gprof可以获得C/C++程序运行期间的统计数据,例如每个函数耗费的时间,函数被调用的次数以及各个函数相互之间的调用关系。gprof可以帮助我们找到程序运行的瓶颈,对占据大量CPU时间的函数进行调优。
PS:gprof统计的只是用户态CPU的占用时间,不包括内核态的CPU时间。gprof对I/O瓶颈无能为力,耗时甚久的I/O操作很可能只占据极少的CPU时间。
如何使用gprof
gprof的使用很简单,遵循以下步骤即可:
参考文档:
https://sourceware.org/binutils/docs/gprof/index.html#Top
6. 小结
没有一个编译器能用好的算法代替低效率的算法,因此程序设计的内容才是仍然是程序员主要关心的。我们应当养成良好的代码风格,给后续的工作带来便捷。
CSAPP 5 - 优化程序性能的更多相关文章
- 优化程序性能(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程序更快.更稳定, 卓越网更便宜,不错的书吧
随机推荐
- STM32学习笔记——USART
STM32的USART组件支持异步.同步.单线半双工.多处理器.IrDA.LIN.SmartCard等模式,本文介绍的是异步即UART模式. 总线通信有三种模型:轮询.中断和DMA.DMA对我来说是陌 ...
- Flutter不能做什么:局限性
老孟导读:您在网络上一定看过很多Flutter如何优秀的.如何完美的文章,而这篇文章将会告诉你Flutter不能做什么,注意并不是Flutter的缺点,比如第三方插件少.Dart不流行等,在我看来这都 ...
- 一个排查了大半天儿的问题,差点又让 MyBatis 背锅
我是风筝,公众号「古时的风筝」,一个不只有技术的技术公众号,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者. Spring Cloud 系列文章已经完 ...
- 200万年薪请不到!清华姚班到底有多牛X?
前几天,清华大学自动化系2020年大一新生的C++作业因为太难而上了热搜,该话题在知乎上的热度一度高达 1300+ 万.  在该帖子下方,有很多关于这件事的讨论,其中很多不禁赞叹"清华太牛 ...
- C#/VB.NET 将SVG图片添加到PDF、转换为PDF
以下内容介绍在C# 程序中如何将SVG图片添加到PDF文档.以及如何将SVG图片转换为PDF文档. 一.环境准备 先下载PDF类库工具,Spire.PDF for .NET hotfix 6.5.6及 ...
- 输入一个整数n,输出契波那契数列的第n项
package bianchengti; /* * 输入一个整数n,输出契波那契数列的第n项 * 斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89... */ p ...
- jQuery的替换/克隆
1. 替换/克隆: 克隆: var $newImg=$img.clone() 2. 事件: 标准: 1. 普通绑定: $().on("事件名",function(){ ... }) ...
- linux常用命令---网络端口信息与进程管理
进程管理 进程管理
- 1417. 重新格式化字符串--来源:力扣(LeetCode)
题目描述: 给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母. 请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同.也就是说,字母后面应该跟着数字,而数字后面应该跟着字母. 请 ...
- 6.Set集合类型操作使用
Set集合类型 (1)介绍 redis的set是string类型的无序集合set元素最大可以包含(2的32次方-1)个元素关于set集合类型除了基本的添加删除操作,其它有用的操作还包含集合的取并集(u ...