optimization blocks (csapp chapter 5.1)
p_511
编译器在没有指示下,会做‘ safe optimization',因此有些优化在没有参数的指示下是不会对代码做优化的,故在程序中应该避免某一类代码,因为它们妨碍了编译器做优化。
optimization blocks: aspects of programs that can severely limit the opportunities for a compiler to generate optimized code;
两类optimization blocks:
1、memory aliasing
pointers may generate the same memory location is known as memory aliasing. In performing only safe optimizations, the compiler must assume that different pointers may be aliased, limiting the set of possible optimizations.
// from cmu
/* Sum rows is of n X n matrix a
and store in vector b */
void sum_rows1(int *a, int *b, int n) {
int i, j;
for (i = ; i < n; i++) {
b[i] = ;
for (j = ; j < n; j++)
b[i] += a[i*n + j];
}
} /*如果我们调用时为
int A[9];
int* B = A + 3;
sum_rows1(A, B);
如果编译器将其优化成如下类的形式,显然有背原意
void sum_rows2(int *a, int *b, int n) {
int i, j;
for (i = 0; i < n; i++) {
double val = 0;
for (j = 0; j < n; j++)
val += a[i*n + j];
b[i] = val;
}
}*/ /*
简化了
sum_rows1:
.L4:
movl %ebp, %ecx
movl $0, (%edx,%ebp,4)
movl $0, %eax
.L3:
movl (%esi,%eax,4), %ebx ;(%esi, %eax, 4) : &a[i*n + j]
addl %ebx, (%edx,%ecx,4) ;(%edx, %ecx, 4) : &b[i]
addl $1, %eax ;%eax : j
cmpl %edi, %eax ;%edi : n
jne .L3 addl $1, %ebp ;%ebp : i
addl (%esp), %esi
cmpl %edi, %ebp
jne .L4
*/
//书上例子
//当xp = yp时,twiddle1 与 twiddle2显然不同,因此编译器不会做一些优化,以免将twiddle1优化成与twiddle2相同的功能函数
void twiddle1(int *xp, int* yp)
{
*xp += *yp;
*xp += *yp;
} void twiddle2(int *xp, int* yp)
{
*xp += * *yp;
}
2、procedure calls
Most compilers do not try to determine whether a function is free of side effects and hence is a candidate for optimizations.Instead, the compiler assumes the worst case and leaves function call intact(原封不动)
//经典(from cmu)
void lower(char* s)
{
int i = ;
for (i = ; i < strlen(s); i++)
if(s[i] >= 'A' && s[i] <= 'Z')
s[i] -= ('A' - 'a');
} //编译器为何不把strlen(s)提取出来,作为一个临时量,这样就可以减少函数调用了? //Why couldn’t compiler move strlen out of inner loop?
// (1)Procedure may have side effects
// Alters global state each time called
// (2)Function may not return same value for given arguments
// Depends on other parts of global state
// Procedure lower could interact with strlen //Warning:
()Compiler treats procedure call as a black box
()Weak optimizations near them
//书上的例子
int f(void); int func1(void)
{
return f() + f() + f() + f();
//procedure call不可优化成4*f(), 否则就错了
} int func2(void)
{
return * f();
} int counter = ; int f(void)
{
return counter++;
}
optimization blocks (csapp chapter 5.1)的更多相关文章
- CSAPP Chapter 8:Exception Control Flow
prcesssor在运行时,假设program counter的值为a0, a1, ... , an-1,每个ak表示相对应的instruction的地址.从ak到ak+1的变化被称为control ...
- [CSAPP] Chapter 1 Overview of Computer
1.1 information is bits + context All computer programs are just a sequence of bits, each with a val ...
- java.lang.String (JDK1.8)
String类实现了java.io.Serializable, Comparable<String>, CharSequence这三个interface. 看了下这三个interface中 ...
- fstrict-aliasing
承如“optimization blocks”文中所述,由于相同的指针可能指向相关的内存区,因此编译器将不做过分的优化…… 特意搜了下编译器在不同的优化等级下都有哪些默认优化,因此有了此记录(比较长, ...
- 转 zabbix 优化方法 以及数据库查询方法 两则
###########sample 1 https://www.cnblogs.com/hanshanxiaoheshang/p/10304672.html (不错) 如何从zabbix server ...
- 【Convex Optimization (by Boyd) 学习笔记】Chapter 1 - Mathematical Optimization
以下笔记参考自Boyd老师的教材[Convex Optimization]. I. Mathematical Optimization 1.1 定义 数学优化问题(Mathematical Optim ...
- 《CSAPP》读书杂记 - Chapter 2. Representing and Manipulating Information
1. 一段查看地址内容的代码 代码: #include <stdio.h> typedef unsigned char *byte_pointer; void show_bytes(byt ...
- 【Convex Optimization (by Boyd) 学习笔记】Chapter 2 - Convex sets(1) 仿射集&凸集
I. 仿射凸集(Affine and convex sets) 1. 线与线段 假设\(R^n\)空间内两点\(x_1,x_2\, (x_1≠x_2)\),那么\(y=\theta x_1+(1-\t ...
- Chapter 14. Blocks and Statements
14.5. Statements There are many kinds of statements in the Java programming language. Most correspon ...
随机推荐
- 基于FPGA的异步FIFO验证
现在开始对上一篇博文介绍的异步FIFO进行功能验证,上一篇博文地址:http://blog.chinaaet.com/crazybird/p/5100000872 .对异步FIFO验证的平台如图1所示 ...
- 【Android】18.1 利用安卓内置的定位服务实现位置跟踪
分类:C#.Android.VS2015: 创建日期:2016-03-04 一.安卓内置的定位服务简介 通常将各种不同的定位技术称为位置服务或定位服务.这种服务是通过电信运营商的无线电通信网络(如GS ...
- 转-webstorm快捷键
默认配置-Eclipse的常用快捷键对照表 查找/代替 Webstorm快捷键 Eclipse快捷键 说明 ctrl+shift+N ctrl+shift+R 通过文件名快速查找工程内的文件(必记) ...
- shell关于日期的加减
$cat sh.sh #!/bin/bash ] ; then ydate=`date -d -1days "+%Y%m%d"` ydateother=`date -d -1day ...
- Java web项目中java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
原来是tomcat找不到MYSQL JAR包的问题.后来又把mysql-connector-java-5.1.7-bin.jar导入到tomcat的lib目录下面就ok了,嘿…… 在java项目中,只 ...
- c++之五谷杂粮---3
3.1如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数. 3.1.1不允许两个函数除了返回类型外所有的要素都相同.(这也是很好解释的) #include<iostream&g ...
- 使用寄存器点亮LED——前言基础知识
在点亮LED之前,我们需要具备一些基础知识: GPIO—general purpose intput output 是通用输入输出端口的简称,简单来说就是软件可控制的引脚,STM32芯片的GPIO引脚 ...
- SpringMVC之学习(0)
Spring MVC 是一个模型 - 视图 - 控制器(MVC)的Web框架建立在中央前端控制器servlet(DispatcherServlet),它负责发送每个请求到合适的处理程序,使用视图来最终 ...
- docker探索-在centos6.5中安装docker(三)
1.要求 centos6.5中需要64位 centos6.5的linux内核需要3.x(centos的内核是2.6) 2.查看当前系统的位数和版本 [root@jacky jacky]# uname ...
- USB 转LAN AX88772B 模块驱动添加记录
使用 AX88772B 模块进行扩展百兆网口. 资料地址: http://www.asix.com.tw/cs/products.php?op=pItemdetail&PItemID=105; ...