优化程序性能(CSAPP:5)

【前言】虽然现在没有接触过大型项目,但是工作了会注重性能。学习一下,应该能更好更快的理解别人写的经典优秀的代码。结合CSAPP和自己的理解,总结一下。

一、程序优化综述

1、高效程序的特点

  (1)适当的算法和数据结构。方法和数据的组织形式无疑是最关键的,是优化的基础;

  (2)代码能够被编译器转化成高效的可执行代码。需要深入了解使用的编译器的优化方法,和常见的优化策略;

  (3)运用现代并行编程技术。多核以及硬件支持提供更大的加速可能,例如GPU;

2、优化程序的一般步骤

  (1)消除不必要的工作,例如消除不必要的函数调用(加大栈区负担),条件测试和内存引用;

  (2)利用处理器提供的指令级并行能力,同时执行多条指令;指令级并行介于线程级并发和单指令多数据并行之间,一个处理器可实现多指令执行,例如流水线技术;

  (3)优化关键路径。就是反复执行的数据和代码;

二、优化编译器的能力和局限性

  我们可以使用-O1、-O2、-O3来指定编译器的优化级别,级别越高可能会增加程序的规模。注意一点,优化级别高一般比级别低的性能好,肯定比原始未优化的好!但是,编译器在优化时会考虑安全问题,如果优化一定会在安全范围内优化,有一个条件不满足就会放弃某模块的优化。

例如:

1 {
2       *y += *x;
3       *y += *x;
4 }
5 //上面的代码会被优化为下面吗?
6 {
7     *y += 2* *x;
8 }

不会,虽然适用一般情况y=y+2x。但是,当x=y时:y=4x 不是3x。编译器会考虑所有特殊情况,保证安全。还有一种情况,是内存别名使用的时候两个变量值不同,但是指针地址有可能相同。也不会优化.

  函数调用也会妨碍优化,此时就是用内联函数优化了。避免频繁出栈入栈。

原文地址:https://www.cnblogs.com/huangfuyuan/p/9180762.html

时间: 2024-08-24 00:49:27

优化程序性能(CSAPP:5)的相关文章

《深入理解计算机系统》 优化程序性能的几个方法

本文几个优化程序性能的方法出自CSAPP第五章,通过不断修改源代码,试图欺骗编译器产生有效的代码 我们先引入度量标准每元素的周期数(CPE),表示程序性能. 我们先定义一个数据结构   data_t 代表数据类型 1 typedef struct{ 2 long len; 3 data_t *data; 4 }vec_rec,*vec_prt; 以及常数IDENT和OP以便在后续的代码中进行不同的操作 //对所有向量的元素求和 #define IDENT 0 #define OP + //对所有

浅谈优化程序性能(下)

前言 在上一篇随笔中,我们谈到最小化一个计算中的操作数量不一定会提高它的性能.现在,就让我们来解开为什么会出现这种情况的原因吧. 处理器体系结构 在计算机的处理器中,处理一条指令包括很多操作,可以分为取指(fetch).译码(decode).执行(execute).访存(memory).写回(write back)和更新程序计数器(PC update)等几个阶段.这些阶段可以在流水线上同时进行,如下图所示: 上图中,F.D.E.M 和 W 分别代表上述五个阶段.当然,现代的处理器比这个示例要复杂

深入理解计算机系统(5.1)------优化程序性能

你能获得的对程序最大的加速比就是当你第一次让它工作起来的时候. 在讲解如何优化程序性能之前,我们首先要明确写程序最主要的目标就是使它在所有可能的情况下都能正常工作,一个运行的很快的程序但是却是错误的结果是没有任何用处的,所以我们在进行程序性能优化之前,首先要保证程序能正常运行,且结果是我们需要的. 而且在很多情况下,让程序跑的更快是我们必须要解决的问题.比如一个程序要实时处理视频帧或者网络包,那么一个运行的很慢的程序就不能解决此问题.再比如一个计算任务计算量非常大,需要数日或者数周,如果我们哪怕

浅谈优化程序性能(上)

前言 我们知道,多项式定义为: 在几何学中,多项式是最简单的平滑曲线.简单是指它仅由乘法及加法构成,平滑是因为它类同口语中的平滑,以数学术语来说,它是无限可微,即它的所有高次微分都存在.事实上,多项式的微分也是多项式.简单及平滑的特点,使多项式在数值分析.图论,以及电脑绘图等,都发挥极大的作用.多项式求值是解决许多问题的核心技术.以数值分析为例,多项式函数常常用作对数学库中的三角函数求近似值. 现在,让我们来用 C 语言写一个对多项式求值的函数吧. 直接的算法 直接按照多项式的定义使用循环求值:

记一次使用ConcurrentDictionary优化程序性能的经验总结

项目情形 最近做项目发现有个业务逻辑性能效率巨慢, 实际上是扫描cosmos上面16个文件夹下面的数据, 每个folder下面大概分为100来个对应user的fodler, 然后对应user folder下面存放的是user的数据. 原逻辑是一个folder一个folder去scan, 然后将统计的数据按照 user和size存放到一个dictionary中, 最后汇总统计并且发邮件. 其中影响效率的部分有当前运行环境与cosmos的交互上, 不同的环境快慢不同. 另外一个就是code逻辑是串行

优化程序性能(3)——提高并行性

在之前的学习中,程序的性能是受运算单元的延迟限制的.正如我们表明的,执行加法和乘法的功能单元是完全流水线化的,这意味着它们可以每个时钟周期开始一个新操作,并且有些操作可以被多个功能单元执行.硬件具有以更高速率执行乘法和加法的潜力,但是代码不能利用这种能力,即使是使用循环展开也不能,这是因为我们将积累值放在一个单独的变量acc中,在前面的计算完成之前,都不能计算acc的新值(顺序依赖).虽然计算acc值的功能单元能够每个时钟周期开始一个新操作,但是它只会每L(L是合并操作的延迟)个周期开始一条新操

web应用程序性能优化

web应用程序基本上都是在浏览器地址栏输入一段网站,然后进入,最后浏览器显示你想要的东西. 这就是用户所能体会到的东西.那作为程序员我们看到了什么呢? 一次HTTP 请求主要的流程是: 1.DNS服务器解析域名(浏览器地址栏的地址)获取相应的IP地址.端口号. 服务名. 2.客户端根据解析后的地址向服务啊发送请求(建立与服务器的联接). 3.服务器根据用户的请求信息处理请求,并做出响应. 4.浏览器更具服务器响应的数据(HTML/css/js)渲染页面. 那要优化程序性能,作为程序员我们能优化哪

iOS 程序性能优化

前言 转载自:http://www.samirchen.com/ios-performance-optimization/ 程序性能优化不应该是一件放在功能完成之后的事,对性能的概念应该从我们一开始写代码时就萦绕在我们脑子里.了解 iOS 程序性能优化的相关知识点,从一开始就把它们落实到代码中是一种好的习惯. 初级技巧 使用复用机制 在我们使用 UITableView 和 UICollectionView 时我们通常会遇到「复用 Cell」这个提法,所谓「复用 Cell」就是指当需要展示的数据条

以C语言为例的程序性能优化 --《深入理解计算机系统》第五章读书笔记

其实大多数的编译器本身就能提供一些简单的优化,比如gcc就能通过使用 -O2 或者 -O3 的选项来优化程序.但编译器的优化始终也是有限,因为它必须小心翼翼保证优化过程不对程序的功能有改动.故而程序员本身应该对程序有优化意识.在我看来,这也是应该有的一种良好的编程习惯. 几种比较简单的优化措施: 1.代码移动 将要执行多次(比如在循环中)但计算结果不会改变的计算,移动到代码前面不会多次求值的部分.举一个比较极端的例子: /* convert string to lowercase: slow*/