ARM C程序设计优化课件_第1页
ARM C程序设计优化课件_第2页
ARM C程序设计优化课件_第3页
ARM C程序设计优化课件_第4页
ARM C程序设计优化课件_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统程序设计大连理工大学软件学院嵌入式系统工程系赖晓晨嵌入式系统程序设计大连理工大学软件学院1ARMC程序设计优化编译器的特性数据类型对程序效率的影响循环方式对程序效率的影响指针对程序效率的影响边界对齐对程序的影响ARMC程序设计优化编译器的特性2一、编译器的特性voidsetzero(char*p,intn){for(;n>0;n--){*p=0;

p++;}}清除从字符型指针p开始的n个字节空间一、编译器的特性voidsetzero(char*p,3编译器的特性(续)voidsetzero(char*p,intn){for(;n>0;n--){*p=0;

p++;}}问题:编译器不知道n是否为0。编译器不知道p是否4字节对齐。编译器不知道n是否为4的倍数。编译器的特性(续)voidsetzero(char*p,4结论:编译器是保守的:必须假定n的所有可能值。必须假定p所有可能的边界值。结论:编译器是保守的:5编写高效C代码的要求了解哪些方面编译器是保守的了解编译器对应的处理器体系结构编写高效C代码的要求了解哪些方面编译器是保守的6二、数据类型对程序效率的影响

unsignedchari;for(i=0;i<100;i++){…}i声明为unsignedchar的优点?无符号字符变量表示的范围超过了100,可以完成题目要求。char更节省寄存器和内存空间。二、数据类型对程序效率的影响unsignedchar7函数参数类型总体思想:尽量采用int、long类型。函数参数类型总体思想:尽量采用int、long类型。8有符号数和无符号数如果程序中只有加、减、乘法,那么有符号数和无符号数的执行效率没有区别。如果有除法,那么需要额外的步骤。有符号数和无符号数如果程序中只有加、减、乘法,那么有符号数和9有符号数和无符号数(续)有符号除法

在ARMC中,如果x是负数,那么除2操作不是一个右移操作。例如-3/2=-1。但是在ARM机器中:-3-2-1直接右移加1右移有符号数和无符号数(续)有符号除法在ARMC10结论:使用无符号数除法效率更高。结论:使用无符号数除法效率更高。11对于存放在寄存器中的变量,尽量采用整型。尽可能使用无符号数进行运算。函数参数和返回值尽量采用整型数据。总结对于存放在寄存器中的变量,尽量采用整型。总结12三、循环方式对程序效率的影响循环是代码优化的重点C程序主要使用for和while进行循环三、循环方式对程序效率的影响循环是代码优化的重点13固定次数的循环什么是ARM上编写for循环最高效的方法?固定次数的循环什么是ARM上编写for循环最高效的方法?14固定次数的循环(续)

inti;for(i=0;i<100;i++){…}

inti;for(i=100;i>0;i--){…}上面代码要实现转移需要两条指令,首先把某寄存器的内容和100比较,其次条件符合时转移。相同功能的代码如果写作下面形式,则可用“BNE”一条指令实现比较以及转移两个功能。固定次数的循环(续)inti;inti;上面代码15至少一次循环对于“for(;n>0;n--)”,如果能确保第一次循环之前n恒大于0,此时取消第一次n大于0的判断,是不会影响程序的逻辑,而且显然程序执行效率可以提高,用do…while…循环可以达到这一目的至少一次循环对于“for(;n>0;n--)”,如果能确保第16循环展开循环开销重复100次,假设每次循环开销占用4个时钟周期,循环体中的加法占用1个时钟周期,那么有效程序仅占CPU执行时间的20%,其余80%都是服务性开销,效率为1/5。

inti,t=0;for(i=100;i>0;i--){ t++;

}循环展开循环开销重复100次,假设每次循环开销占用4个时钟周17循环展开(续)

inti,t=0;for(i=50;i>0;i--){ t++;

t++;

}每次循环开销4个时钟周期不变,但是有效程序占用2个时钟周期,也即效率提高到1/3。循环展开(续)inti,t=0;每次循环开销4个时钟周18循环展开(续)问题:循环展开到什么程度?全部展开是否最优?要意识到循环展开是有代价的:增加程序的长度。循环体内代码越多,就越有可能造成cache失效所以在任何程度上展开循环要具体问题具体分析,在执行时间和代码量间找到一个最佳平衡点。循环展开(续)问题:循环展开到什么程度?全部展开是否最优?要19总结:循环计数递减。如确定循环次数大于1,那么用do…wile。对于小循环体,可以循环展开。总结:循环计数递减。20四、指针对程序效率的影响别名当两个指针指向同一个对象时,这两个指针被称作该对象的别名。编译器的特点:不知道是否是别名编译器是悲观的四、指针对程序效率的影响别名21指针对程序效率的影响(续)voidthrowtobag(int*mybag,int*yourbag,int

*stone){

*mybag+=*stone; //语句1

*yourbag+=*stone; //语句2}站在编译器的角度思考一下有无问题?指针对程序效率的影响(续)voidthrowtobag(i22指针对程序效率的影响(续)上面代码的语句1被GCC编译时,会出现诸如“LDRri,[r2,#0]”之类汇编指令,表示首先要从stone指向的地址读出一个数据,以便来把它加到mybag指向指明的地址处。此处r2代表stone,因为它是函数的第三个参数,轮到r2来承载它。令人惊奇的是,编译语句2时,仍然包含一条“LDRri,[r2,#0]”语句,stone的值不是已经由语句1得到了吗?为什么还要这一条语句?指针对程序效率的影响(续)上面代码的语句1被GCC编译时,会23指针对程序效率的影响(续)讨论:编译器不会自动识别指针指向的对象不知道是否是别名悲观、保守思考:采用什么办法可以避免读两次内存?指针对程序效率的影响(续)讨论:编译器不会自动识别指针指向的24五、边界对齐对程序的影响边界对齐问题__packed关键字五、边界对齐对程序的影响边界对齐问题25边界对齐问题对齐问题对结构体也有影响。在结构体中定义若干变量如果长短相间,由于对齐问题,势必浪费一些空间。例如一个整形变量和一个字符变量放在一起,总共占用8个字节空间,但是其中保存有效数据的只有5个字节。所以可以采用这种策略:在结构体的最前面定义的所有的字符型变量,中间定义所有的短整型变量,最后定义所有的整形变量,可以把浪费的空间减到最小。边界对齐问题对齐问题对结构体也有影响。在结构体中定义若干变量26__packed关键字有的C编译器支持__packed关键字,它可以突破边界对齐的限制,在任意类型的变量按照任意顺序定义的情况下,都能够紧凑的安排存储空间,此时的代价是牺牲程序的运行效率__packed关键字有的C编译器支持__packed关键字27__packed关键字(续)代码完成从任意地址p处读取一个整型变量,且不要求此地址是4的整数倍,返回值为此地址起始的4字节数据。

int

fetchint(__packedint*p){return*p;}__packed关键字(续)代码完成从任意地址p处读取一个整28__packed关键字(续)上图是上述代码的实例,数据按照小端存储,读取一个没有对齐的整型数据。__packed关键字(续)上图是上述代码的实例,数据按照小29__packed关键字(续)地址不对齐时,即使是非常简单的读取一个整型数据,也比较复杂。__packed节约了空间,但是损失了运行效率。在硬件资源已经非常丰富的今天,空间限制已经不是主要矛盾,程序效率往往更受人关注。__packed关键字(续)地址不对齐时,即使是非常简单的读30嵌入式系统程序设计大连理工大学软件学院嵌入式系统工程系赖晓晨嵌入式系统程序设计大连理工大学软件学院31ARMC程序设计优化编译器的特性数据类型对程序效率的影响循环方式对程序效率的影响指针对程序效率的影响边界对齐对程序的影响ARMC程序设计优化编译器的特性32一、编译器的特性voidsetzero(char*p,intn){for(;n>0;n--){*p=0;

p++;}}清除从字符型指针p开始的n个字节空间一、编译器的特性voidsetzero(char*p,33编译器的特性(续)voidsetzero(char*p,intn){for(;n>0;n--){*p=0;

p++;}}问题:编译器不知道n是否为0。编译器不知道p是否4字节对齐。编译器不知道n是否为4的倍数。编译器的特性(续)voidsetzero(char*p,34结论:编译器是保守的:必须假定n的所有可能值。必须假定p所有可能的边界值。结论:编译器是保守的:35编写高效C代码的要求了解哪些方面编译器是保守的了解编译器对应的处理器体系结构编写高效C代码的要求了解哪些方面编译器是保守的36二、数据类型对程序效率的影响

unsignedchari;for(i=0;i<100;i++){…}i声明为unsignedchar的优点?无符号字符变量表示的范围超过了100,可以完成题目要求。char更节省寄存器和内存空间。二、数据类型对程序效率的影响unsignedchar37函数参数类型总体思想:尽量采用int、long类型。函数参数类型总体思想:尽量采用int、long类型。38有符号数和无符号数如果程序中只有加、减、乘法,那么有符号数和无符号数的执行效率没有区别。如果有除法,那么需要额外的步骤。有符号数和无符号数如果程序中只有加、减、乘法,那么有符号数和39有符号数和无符号数(续)有符号除法

在ARMC中,如果x是负数,那么除2操作不是一个右移操作。例如-3/2=-1。但是在ARM机器中:-3-2-1直接右移加1右移有符号数和无符号数(续)有符号除法在ARMC40结论:使用无符号数除法效率更高。结论:使用无符号数除法效率更高。41对于存放在寄存器中的变量,尽量采用整型。尽可能使用无符号数进行运算。函数参数和返回值尽量采用整型数据。总结对于存放在寄存器中的变量,尽量采用整型。总结42三、循环方式对程序效率的影响循环是代码优化的重点C程序主要使用for和while进行循环三、循环方式对程序效率的影响循环是代码优化的重点43固定次数的循环什么是ARM上编写for循环最高效的方法?固定次数的循环什么是ARM上编写for循环最高效的方法?44固定次数的循环(续)

inti;for(i=0;i<100;i++){…}

inti;for(i=100;i>0;i--){…}上面代码要实现转移需要两条指令,首先把某寄存器的内容和100比较,其次条件符合时转移。相同功能的代码如果写作下面形式,则可用“BNE”一条指令实现比较以及转移两个功能。固定次数的循环(续)inti;inti;上面代码45至少一次循环对于“for(;n>0;n--)”,如果能确保第一次循环之前n恒大于0,此时取消第一次n大于0的判断,是不会影响程序的逻辑,而且显然程序执行效率可以提高,用do…while…循环可以达到这一目的至少一次循环对于“for(;n>0;n--)”,如果能确保第46循环展开循环开销重复100次,假设每次循环开销占用4个时钟周期,循环体中的加法占用1个时钟周期,那么有效程序仅占CPU执行时间的20%,其余80%都是服务性开销,效率为1/5。

inti,t=0;for(i=100;i>0;i--){ t++;

}循环展开循环开销重复100次,假设每次循环开销占用4个时钟周47循环展开(续)

inti,t=0;for(i=50;i>0;i--){ t++;

t++;

}每次循环开销4个时钟周期不变,但是有效程序占用2个时钟周期,也即效率提高到1/3。循环展开(续)inti,t=0;每次循环开销4个时钟周48循环展开(续)问题:循环展开到什么程度?全部展开是否最优?要意识到循环展开是有代价的:增加程序的长度。循环体内代码越多,就越有可能造成cache失效所以在任何程度上展开循环要具体问题具体分析,在执行时间和代码量间找到一个最佳平衡点。循环展开(续)问题:循环展开到什么程度?全部展开是否最优?要49总结:循环计数递减。如确定循环次数大于1,那么用do…wile。对于小循环体,可以循环展开。总结:循环计数递减。50四、指针对程序效率的影响别名当两个指针指向同一个对象时,这两个指针被称作该对象的别名。编译器的特点:不知道是否是别名编译器是悲观的四、指针对程序效率的影响别名51指针对程序效率的影响(续)voidthrowtobag(int*mybag,int*yourbag,int

*stone){

*mybag+=*stone; //语句1

*yourbag+=*stone; //语句2}站在编译器的角度思考一下有无问题?指针对程序效率的影响(续)voidthrowtobag(i52指针对程序效率的影响(续)上面代码的语句1被GCC编译时,会出现诸如“LDRri,[r2,#0]”之类汇编指令,表示首先要从stone指向的地址读出一个数据,以便来把它加到mybag指向指明的地址处。此处r2代表stone,因为它是函数的第三个参数,轮到r2来承载它。令人惊奇的是,编译语句2时,仍然包含一条“LDRri,[r2,#0]”语句,stone的值不是已经由语句1得到了吗?为什么还要这一条语句?指针对程序效率的影响(续)上面代码的语句1被GCC编译时,会53指针对程序效率的影响(续)讨论:编译器不会自动识别指针指向的对象不知道是否是别名悲观、保守思考:采用什么办法可以避免读两次内存?指针对程序效率的影响(续)讨论:编译器不会自动识别指针指向的54五、边界对齐对程序的影响边界对齐问题__packed关键字五、边界对齐对程序的影响边界对齐问题55边界对齐问题

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论