【前言】虽然现在没有接触过大型项目,但是工作了会注重性能。学习一下,应该能更好更快的理解别人写的经典优化的代码。结合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,所以第一种不是一种好的编码,没有很好的体现编程思路。编译器会考虑所有特殊情况,保证安全。还有一种情况,是内存别名使用的时候两个变量值不同,但是指针地址有可能相同。也不会优化.

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

 三、优化实现方法

发现一个别人总结的,挺全面的:http://www.xuebuyuan.com/3204184.html

1、上面已经看到了尽量减少函数调用来降低栈压力;

2、消除循环中的多次条件测试。举例:

for(int i=0;i<v.size();++i)
{
//TODO
} //上面和下面对比 int s =v.size();
for(int i=0;i<s;++i)
{
//TODO
}

含有循环的代码在翻译成机器级程序时,会先转换成goto语句去掉复杂逻辑,然后转换成汇编语言。所以每次都要计算测试条件,像上面这种多次计算测试条件不变的可以提前算好,赋值给局部变量,局部变量放在数据区也减轻栈的压力。如此就不要每次计算了,因为计算大小调用库函数还是需要很大的计算量的。

3、消除不必要的内存引用

  这里主要是内存和寄存器的存取性能差别。可以将循环中的变量临时放在累加器寄存器中,计算到最后在写入内存。另一个方面,对于寄存器溢出要在栈上分配空间,也会拖慢性能,所以对寄存器数量和并发量要协调。

4、现代处理器优化

  上面的1--3优化只是简单的降低过程调用的开销,以及消除了一些重复计算和存取瓶颈。跟、更深层次的,我们应该写出适应现代处理器架构的代码,充分发挥其性能。最基础和重要我们要理解其指令级并行,在指令级并行里面主要有两个问题:延迟界限和吞吐量界限。延迟界限指一条指令必须在另一条指令之后,吞吐量界限是硬件层面原始计算能力,是程序性能的终极限制。分支预测从软件算法层面提供延迟界限,流水线技术提高吞吐量,具体CSAPP-357

5、循环展开

就是在一次循环里面计算多个元素,例如下例可以将循环减半。

//一般做法
for(i=1;i<n;++i)
{
p[i]=p[i-1]+a[i];
} //一次循环计算两个
{int i;//全局
for(i=1;i<n-1;i+=2)
{
int tmp=p[i-1]+a[i];
p[i]=tmp;
p[i+1]=mid+a[i+1]
}
if(i<n)
{p[i]=p[i+1+a[i];]}
}

性能是提高了,但是可读性比较差。用在核心代码的瓶颈区比较合适。

6、更低级优化

并行能力提高:将一个问题拆分,最后多变量合并.。例如:将累乘分为偶数和奇数的分别累乘然后求积,偶数和奇数的计算分开并行。注意栈是线程独享的,多线程可解决一个大问题需要的栈太深的问题!

写出针对性的分支预测算法:分支预测只对有规律的模式可行,所以可以写出更加“智能”的分支预测选择算法。根据命中率进行一个排序就能写出一个优秀的分支预测算法。结合机器学习会不会效率低?太偏上层了。

 四、综述

优化程序性能的基本策略。

(1)高级设计:选择合适的数据结构和算法;

(2)基本编码原则,就是"三"中提到的;

(3)更低级的优化:循环展开、提高指令并行度(6),重写分支预测算法。后者属于高级内容。

更多内容参考《深入理解计算机系统CSAPP》第五章

优化程序性能(CSAPP)的更多相关文章

  1. CSAPP 5 - 优化程序性能

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

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

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

  3. web应用程序性能优化

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

  4. iOS 程序性能优化

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

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

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

  6. java程序性能优化

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

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

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

  8. Java程序性能优化技巧

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

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

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

随机推荐

  1. Codeforces Round #626 Div2 D. Present(位掩码,二分)

    题目链接:https://codeforces.com/contest/1323/problem/D 题意:给了大小为4e5的数组a,其中1<=ai<=1e7.求所有点对和的异或和,即: ...

  2. c语言实现n!算法

    最近一面学习数据结构,一面在做些c语言的题目.这个题目前些天碰到,和同学讨论了下.于是就用c语言实现n!(n=10000) 1 #include<stdio.h> 2 #define MA ...

  3. MIT 6.S081 聊聊xv6的文件系统(中)日志层与事务

    前言 我本想把上篇中没讲完的剩余层全部在本篇中讲完,但没想到越写越多.日志层的代码不多,其思想和解决问题的手段也不算难以理解,但其背后涉及的原理和思想还是非常值得回味的,因此我打算用一整篇完整的blo ...

  4. 笔记-EF Core 并发冲突与令牌

    并发标记并发分悲观并发和乐观并发.悲观并发:比如有两个用户A,B,同时登录系统修改一个文档,如果A先进入修改,则系统会把该文档 锁住,B就没办法打开了,只有等A修改完,完全退出的时候B才能进入修改.乐 ...

  5. java8按照lamda表达式去重一个list,根据list中的一个元素

    /** * 按照指定字段给list去重 * @param list * @return */ public static List<DataModel> niqueList(List< ...

  6. 概率分析方法与推断统计(来自我写的python书)

    在数据分析统计的场景里,常用的方法除了描述性统计方法外,还有推断统计方法,如果再从工作性质上来划分,推断统计包含了参数估计和假设验证这两方面的内容.而推断统计用到了很多概率统计方法,所以本小节在介绍推 ...

  7. 基于HSV彩色空间与直方图信息的植物叶脉FFCM算法提取

    宣旭峰,王美丽,张建锋. 基于HSV彩色空间与直方图信息的植物叶脉FFCM算法提取[J/OL]. 计算机应用研究,2018,(08):1-7. (2017-07-21)[2017-10-09]. ht ...

  8. 【GitChat首秀:限时免费】互联网测试岗校招的那些事儿

    2020 校园秋招即将结束,2021 校招春招即将开始. 作为一名扎根互联网近十年的资深测试开发,我刚经历过数十个测试岗位的校招笔试和面试选拔.在 2020 年秋招面试过程中,我深深地感受到" ...

  9. 系统扩展与 macOS 不兼容

    系统扩展与 macOS 不兼容 某些系统扩展与当前版本的 macOS 不兼容或将与后续 macOS 版本不兼容 https://support.apple.com/zh-cn/HT210999 ref ...

  10. H5 CSS 悬浮滚动条

    H5 CSS 悬浮滚动条 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!