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)的更多相关文章

  1. CSAPP Chapter 8:Exception Control Flow

    prcesssor在运行时,假设program counter的值为a0, a1, ... , an-1,每个ak表示相对应的instruction的地址.从ak到ak+1的变化被称为control ...

  2. [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 ...

  3. java.lang.String (JDK1.8)

    String类实现了java.io.Serializable, Comparable<String>, CharSequence这三个interface. 看了下这三个interface中 ...

  4. fstrict-aliasing

    承如“optimization blocks”文中所述,由于相同的指针可能指向相关的内存区,因此编译器将不做过分的优化…… 特意搜了下编译器在不同的优化等级下都有哪些默认优化,因此有了此记录(比较长, ...

  5. 转 zabbix 优化方法 以及数据库查询方法 两则

    ###########sample 1 https://www.cnblogs.com/hanshanxiaoheshang/p/10304672.html (不错) 如何从zabbix server ...

  6. 【Convex Optimization (by Boyd) 学习笔记】Chapter 1 - Mathematical Optimization

    以下笔记参考自Boyd老师的教材[Convex Optimization]. I. Mathematical Optimization 1.1 定义 数学优化问题(Mathematical Optim ...

  7. 《CSAPP》读书杂记 - Chapter 2. Representing and Manipulating Information

    1. 一段查看地址内容的代码 代码: #include <stdio.h> typedef unsigned char *byte_pointer; void show_bytes(byt ...

  8. 【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 ...

  9. Chapter 14. Blocks and Statements

    14.5. Statements There are many kinds of statements in the Java programming language. Most correspon ...

随机推荐

  1. mysql部分学习心得(入门级别)

    mysql中针对不同的数据选择对应的存储引擎 mysql中也会针对不同的数据处理选择对应的存储的引擎 mysql中也会针对不同的数据处理选择对应的存储的引擎 mysql中一些授权(grant)等的通常 ...

  2. The DiskSpd Storage Performance Tool

    https://enterpriseitnotes.wordpress.com/2013/05/31/understanding-ios-iops-and-outstanding-ios/ https ...

  3. 黑客编程教程(六)Windows的关机和重起

    第六节 Windows的关机和重起 很多木马都有远程关机功能,但这并不是一个很好的功能.不过对于入侵服务器,有时需要重起服务器.其实对于关机和重起,只需要调用几个 API函数即可实现. 对于WIN9X ...

  4. nyoj592 spiral grid

    spiral grid 时间限制:2000 ms  |  内存限制:65535 KB 难度:4   描述 Xiaod has recently discovered the grid named &q ...

  5. py自动化之环境配置

    1,官网下载py,点击安装,配置环境变量 2,下载setuptools,用于安装pip (python setup.py install) 3,下载pip,用于安装selenium(pip insta ...

  6. PowerShell中实现人机交互

    编写脚本的过程中有很多时候需要进行人机交互,比如我写一个脚本,需要动态的输入一些内容,比如用户名和密码之类的东西,这些是没办法事先写进代码里的.而通过外部文件进行信息读取,友好性又差了点.所以当我们需 ...

  7. 续写上一篇的数组or指针操作

    C语言,同样使用if else while 这样的语法,但不同的人,就是有不同的实现方式,甚至是技巧. eg: #include <stdio.h> #include<string. ...

  8. DHCP配置实例

    配置DHCP的思路: 1.创建dhcp服务2.添加一个网络号(或者说地址池)3.排除路由器的网管4.排除DHCP的网关 代码: Router>enableRouter#configRouter# ...

  9. 【WPF】自动完成/智能提示的文本框(AutoCompleteBox)

    使用了插件WPFToolKit.(直接在Nuget中搜即可) 使用方法参考这篇文章: http://www.broculos.net/2014/04/wpf-autocompletebox-autoc ...

  10. am335x Linux kernel DTS pinmux 定义记录

    记录am335x TI PDK3.0 Linux Kernel 设备的pinmux 的配置 在TI 的Linux kernel 设备树里面,有很多关于pinctrl-single,pins 的配置, ...