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 ...
随机推荐
- vim:去掉响铃
vim在移动字符出界(上下左右)包括按<ESC>建都会响铃,有时候真的很烦. 在网上搜了一下,原来是visualbell来控制的,在vim里使用命令:help visualbell,原来禁 ...
- 每天一个linux命令(1):tail 命令
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新, ...
- hdoj1160 FatMouse's Speed 动态规划
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- USB设备驱动程序学习笔记(二)
一.usbmouse_as_key.c /* * drivers\hid\usbhid\usbmouse.c */ #include <linux/kernel.h>#include &l ...
- 更改datatables的分页切换时的'processing'提示信息的式样
jquery.dataTables.css .dataTables_wrapper .dataTables_processing { position: absolute; top: 50%; lef ...
- js冒泡事件
一.什么是事件冒泡 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处 理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个 ...
- LeetCode: Letter Combinations of a Phone Number 解题报告
Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations ...
- jquery 给每个li增加事件
<ul id = "list-unstyled"> <li>aaa</li> <li>bbb</li> <li&g ...
- 线程池 ManualResetEvent
线程池: “线程池”是可以用来在后台执行多个任务的线程集合.(有关背景信息,请参见使用线程处理.)这使主线程可以自由地异步执行其他任务. 线程池通常用于服务器应用程序.每个传入请求都将分配给线程池中的 ...
- 阿里云ECS,WampServer无法访问外网
情况: 使用阿里云ECS服务器.服务端打开WampServer后,在服务端能通过127.0.0.1和localhost访问到WampServer的首页. 阿里云已经给了外网IP,不需要路由器再做端口映 ...