代码移动:

如果一个表达式总是得到同样的结果,最好把它移动到循环外面,这样只需要计算一次。编译器有时候可以自动完成,比如说使用 -O1 优化。一个例子:

void set_row(double *a, double *b, long i, long n){
long j;
for (j = 0; j < n; j++){
a[n*i + j] = b[j];
}
}

这里n*i是重复被计算的,可以放到循环外面

long j;
int ni = n * i;
for (j = 0; j < n; j++){
a[ni + j] = b[j];
}

消除不必要的内存引用:

for(int i = 0;i < n;i++)
{
*p = *p OP data[i];
} //new
int t = *p;
for()
{
t = t OP data[i];
}
*p = t;

上面的过程中,每次循环要经历2次读1次写:

从p读取值 -> 读取data[i]进行计算 -> 写到p

但该进之后,每次循环只需要一次读

vmovesd (%rbx),%xmm();        //read from p
vmulsd (%rdx),%xmm(),%xmm(); //mul by data[]
vmovesd %xmm(),(%rbx); //store vmulsd (%rdx),%xmm(),%xmm(); //mul by data[]

处理条件分支

现代处理器普遍采用超标量设计,也就是基于流水线来进行指令的处理,也就是说,当执行当前指令时,接下来要执行的几条指令已经进入流水线的处理流程了。

对于顺序执行来说,不会有任何问题,但是对于条件分支来说,在跳转指令时可能会改变程序的走向,也就是说,之前载入的指令可能是无效的。这个时候就只能清空流水线,然后重新进行载入。为了减少清空流水线所带来的性能损失,处理器内部会采用称分支预测』的技术。

例:

当遇到if语句的时候,你事先完全不知道应该往哪边走。你可以暂停,等待直到之前的指令执行完成,然后比较结果,然后往正确的那个方向走。

但是现代计算机有很长的流水线,等待结果必定会浪费很多时间。于是有了分支预测,先假设分支方向,加入流水线,如果对了就可以继续执行下去。否则清空流水线再向正确的地方前进。

条件转移:

在有的情况下,书写合适的条件转移可以实现分支。

if(a > b)
{
int t = a;
a = b;
b = a;
}

上面的代码会进行分支预测,改:

if(a > b)
{
int tmax = a < b? b:a;
int tmin = a > b? b:a;
a = tmin;
b = tmax;
}
// a < b ? b:a;可以等效于:
tmax = b;
tmp = a;
t = a < b;
if(!t) tmax=tmp;

循环展开:

通过增加每次迭代的计算量,减少循环次数。

1.减少了循环索引计数和条件分支

2.提供了进一步利用机器特性进行的优化的机会

int ans = 0;
for(int i = 0;i < n;i += 2)
{
ans = ans OP data[i] OP data[i+1];
}

提高并行化:

1.多个累积变量

在加法和乘法功能的时候,功能单元是完全流水线化的。使其能更高效的执行

for(int i = 0;i < n;i+=2)
{
ans0 = ans0 OP data[i];
ans1 = ans1 OP data[i+1];
}

与上面相比关键路径上面的操作由 n->n/2。而且结果ans0 和 ans1不相关,流水线性能应该会提升。

2.重新结合变化

 ans = ans OP data[i] OP data[i+1];
ans = ans OP (data[i] OP data[i+1]);

可能看着没什么区别,但是data[i]*data[i+1]的计算完全不用考虑上一次循环的结果,流水线能得到充分利用


参考资料:

不周山之读薄CSAPP:http://wdxtub.com/2016/04/16/thin-csapp-0/

浅谈分支预测、流水线和条件转移:http://www.cnblogs.com/yangecnu/p/4196026.html#undefined

《深入理解计算机系统 》

CSAPP-程序优化的更多相关文章

  1. CSAPP 5 - 优化程序性能

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

  2. Java 程序优化 (读书笔记)

    --From : JAVA程序性能优化 (葛一鸣,清华大学出版社,2012/10第一版) 1. java性能调优概述 1.1 性能概述 程序性能: 执行速度,内存分配,启动时间, 负载承受能力. 性能 ...

  3. GPU 编程入门到精通(五)之 GPU 程序优化进阶

    博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识.鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程. 有志同道合的小伙 ...

  4. 大页内存(HugePages)在通用程序优化中的应用

    今天给大家介绍一种比较新奇的程序性能优化方法-大页内存(HugePages),简单来说就是通过增大操作系统页的大小来减小页表,从而避免快表缺失.这方面的资料比较贫乏,而且网上绝大多数资料都是介绍它在O ...

  5. 从设计模式的角度看Java程序优化

    一.前言 Java程序优化有很多种渠道,比如jvm优化.数据库优化等等,但都是亡羊补牢的措施,如果能在设计程序架构时利用设计模式就把程序的短板解决,就能使程序更加健壮切容易维护迭代 二.常用的设计模式 ...

  6. JDBC程序优化--提取配置信息放到属性文件中

    JDBC程序优化--提取配置信息放到属性文件中 此处仅仅优化JDBC连接部分,代码如下: public class ConnectionFactory { private static String ...

  7. 单片机C程序优化

    单片机C程序优化 对程序进行优化,通常是指优化程序代码或程序执行速度.优化代码和优化速度实际上是一个予盾的统一.一般是优化了代码的尺寸,就会带来执行时间的增加:如果优化了程序的执行速度,通常会带来代码 ...

  8. 转载:erlang程序优化点的总结

    erlang程序优化点的总结(持续更新) 转自:http://wqtn22.iteye.com/blog/1820587 转载请注明出处 注意,这里只是给出一个总结,具体性能需要根据实际环境和需要来确 ...

  9. 关于C#程序优化的五十种方法

    关于C#程序优化的五十种方法    这篇文章主要介绍了C#程序优化的五十个需要注意的地方,使用c#开发的朋友可以看下   一.用属性代替可访问的字段 1..NET数据绑定只支持数据绑定,使用属性可以获 ...

  10. GPU 编程入门到精通(四)之 GPU 程序优化

    博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

随机推荐

  1. C语言第三次博客作业—循环结构

    一.PTA实验作业 题目1 1.实验代码 int N,i; //N为用户数 char sex; //sex表示性别 double High; //Hight表示身高 scanf("%d&qu ...

  2. C语言作业--数组

    一.PTA实验作业 题目1:7-5 数组循环左移 1. 本题PTA提交列表 2. 设计思路 定义俩个整数 n,m 定义循环变量i,j,x 定义变量k用来存放下标 定义变量number用于交换数值 定义 ...

  3. 201621123031 《Java程序设计》第10周学习总结

    作业10-异常 1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 1.捕捉异常 Java中的异常捕获结构由try.catch和finally三个部分组成.其中try语句 ...

  4. python day1 基本语法作业

    一.过7 start =1 while start<=10: if start !=7: print(start) start +=1 二.100以内的和 sum = 0 start = 1 w ...

  5. scrapy 避免被ban

    1.settings.pyCOOKIES_ENABLED = False DOWNLOAD_DELAY = 3 ROBOTSTXT_OBEY = Falseip代理池设置 IPPOOL = [{'ip ...

  6. pandas 数据分析使用

    https://github.com/Erick-LONG/data_analysis/blob/master/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%20%E9%8 ...

  7. hi-nginx-1.4.2发布,多项重要更新

    支持多种编程语言混合开发web应用的通用服务器hi-nginx-1.4.2已经发布了. 此次发布包含多项重要更新: 支持python2和3,通过编译选项--with-http-hi-python-ve ...

  8. Python 迭代器之列表解析

     [TOC] 尽管while和for循环能够执行大多数重复性任务, 但是由于序列的迭代需求如此常见和广泛, 以至于Python提供了额外的工具以使其更简单和高效. 迭代器在Python中是以C语言的 ...

  9. 学习UI的总结

    学习前端有一段时间了,一直在看书上的理论知识,而实战项目却很少.老师常说,想要知道自己的实力有多少,知识掌握了多少,最好的方法就是去实践了,实践出真知嘛.于是在学习中,总要是通过项目的实践以及理论知识 ...

  10. Css之导航栏下拉菜单

    Css: /*下拉菜单学习-2017.12.17 20:17 added by ldb*/ ul{ list-style-type:none; margin:; padding:; overflow: ...