CS:app 读书笔记----循环体的机器级表示及优化
2008-07-16 21:50
281 查看
一段写好的C程序,会经过预处理,编译,链接,生成目标代码,生成可执行代码等几个步骤.其中文本源程序经历预处理到达汇编代码的过程中,编译器会对我们的代码进行相应的优化和调整.有时候,通过阅读(编译器生成的)汇编代码,可以学到很多东西.
在这里,所使用的编译平台是IA32下的GCC(version 3.2),我自己做实验的时候机器平台是(Windows XP Mingw-gcc 4.3.2)
首先来一段很简单的C程序:
1 int fib_w(int n)
2 {
3 int i = 1;
4 int val = 1;
5 int nval = 1;
6
7 while (i<n) {
8 int t = val+nval;
9 val = nval;
10 nval = t;
11 }
12
13 return val;
14 }
15
这段代码 描述的是 计算第N项fibonacci(菲波那西数列)的值.
有关fibonacci的介绍:
这个数列是意大利中世纪数学家斐波那契在<算盘全书>中提出的,这个级数的通项公式,除了具有a(n+2)=an+a(n +1)/的性质外,还可以证明 通项公式为:an=1/√[(1+√5/2) n-(1-√5/2) n](n=1,2,3.....) 这个通项公式中虽然 所有的an都是正整数,可是它们却是由一些无理数表示 出来的。
运行GCC
gcc -O2 fib_w.c -S
生成GUN汇编代码(GAS)
1 movl 8(%ebp), %eax
2 movl $1,%ebx
3 movl $1,%ecx
4 cmpl %eax,%ebx
5 jge .L9
6 leal -1(%eax),%edx
7 .L10:
8 leal (%ecx,%ebx),%eax
9 movl %ecx,%ebx
10 movl %eax,%eax
11 decl %edx
12 jnz .L10
13 .L9:
14
15 ---------------------------------------------------------
16 省略栈创建代码
上述代码 转换成某种扩展的C之后,是这样的
1int fib_w_goto(int n)
2
这样的循环结构,gun汇编器将其转换成了do-while结构,同时为了避免可能的do循环体首次执行,添加了相应的if判断。
而且我们发现这里,并没有出现我们一开始设置的变量i,而是出现了一个nmi的新变量,她的指等于n-i;这使得编译器只使用
三个寄存器作为循环变量,而不是原来的四个寄存器;其次,[u]他把初始判定(i<n)优化成了(val<n),这样i就彻底消失了,这在编译器中是很常见的。最后,为了循环的连续执行,要保证i<=n,这样编译器就假设nmi是非负的了.因此只需要将nmi!=0。这样就在汇编中又少了一条指令.[/u]
在这里,所使用的编译平台是IA32下的GCC(version 3.2),我自己做实验的时候机器平台是(Windows XP Mingw-gcc 4.3.2)
首先来一段很简单的C程序:
1 int fib_w(int n)
2 {
3 int i = 1;
4 int val = 1;
5 int nval = 1;
6
7 while (i<n) {
8 int t = val+nval;
9 val = nval;
10 nval = t;
11 }
12
13 return val;
14 }
15
这段代码 描述的是 计算第N项fibonacci(菲波那西数列)的值.
有关fibonacci的介绍:
这个数列是意大利中世纪数学家斐波那契在<算盘全书>中提出的,这个级数的通项公式,除了具有a(n+2)=an+a(n +1)/的性质外,还可以证明 通项公式为:an=1/√[(1+√5/2) n-(1-√5/2) n](n=1,2,3.....) 这个通项公式中虽然 所有的an都是正整数,可是它们却是由一些无理数表示 出来的。
运行GCC
gcc -O2 fib_w.c -S
生成GUN汇编代码(GAS)
1 movl 8(%ebp), %eax
2 movl $1,%ebx
3 movl $1,%ecx
4 cmpl %eax,%ebx
5 jge .L9
6 leal -1(%eax),%edx
7 .L10:
8 leal (%ecx,%ebx),%eax
9 movl %ecx,%ebx
10 movl %eax,%eax
11 decl %edx
12 jnz .L10
13 .L9:
14
15 ---------------------------------------------------------
16 省略栈创建代码
上述代码 转换成某种扩展的C之后,是这样的
1int fib_w_goto(int n)
2
这样的循环结构,gun汇编器将其转换成了do-while结构,同时为了避免可能的do循环体首次执行,添加了相应的if判断。
而且我们发现这里,并没有出现我们一开始设置的变量i,而是出现了一个nmi的新变量,她的指等于n-i;这使得编译器只使用
三个寄存器作为循环变量,而不是原来的四个寄存器;其次,[u]他把初始判定(i<n)优化成了(val<n),这样i就彻底消失了,这在编译器中是很常见的。最后,为了循环的连续执行,要保证i<=n,这样编译器就假设nmi是非负的了.因此只需要将nmi!=0。这样就在汇编中又少了一条指令.[/u]
相关文章推荐
- CS:app 读书笔记----循环体的机器级表示及优化
- CS-APP CP2 信息的表示和处理
- 移动APP性能测评与优化读书笔记-1.1 内存分析
- 【原创】循环体并行优化(二) ——多维循环迭代空间的仿射变换及循环上下界不等式的矩阵表示法
- cs app深入理解计算机系统:第五章 优化程序性能 几个优化的java实现
- 读书笔记——《深入理解计算机系统》第三章_程序的机器级表示(一)
- Learning by doing 二 深入理解计算机系统(CS:APP)一信息表示
- 读书笔记——《深入理解计算机系统》第三章_程序的机器级表示(二)
- 电商app开发架构设计优化购物车环节
- 读书笔记_科学计算与企业级应用的并行优化
- Android App 瘦身总结 第一章 图片资源的优化处理
- ios 性能优化之app运行时数据收集
- Android性能优化系列之App启动优化
- 为什么vs2005建立的cs类要放在app_code文件夹才能在其他页面用?
- 《神经网络设计》读书笔记——性能优化(三)
- Android App性能优化笔记之一:性能优化是什么及为什么?
- Android APP 优化
- 《高性能MySQL》读书笔记--查询性能优化
- iOS APP性能优化
- 【WPF】app.g.cs文件无法修改、修改后自动恢复问题解决办法