欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > PPT文档下载  

    程序设计优化.ppt

    • 资源ID:259535       资源大小:644.50KB        全文页数:29页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    程序设计优化.ppt

    2023/3/30,程序设计优化,程序设计优化,程序设计优化,ARM C程序设计优化,编译器的特性数据类型对程序效率的影响循环方式对程序效率的影响指针对程序效率的影响边界对齐对程序的影响,程序设计优化,一、编译器的特性,void setzero(char*p,int n)for(;n0;n-)*p=0;p+;,清除从字符型指针p开始的n个字节空间,程序设计优化,编译器的特性(续),void setzero(char*p,int n)for(;n0;n-)*p=0;p+;,问题:编译器不知道n是否为0。编译器不知道p是否4字节对齐。编译器不知道n是否为4的倍数。,程序设计优化,结论:,编译器是保守的:必须假定n的所有可能值。必须假定p所有可能的边界值。,程序设计优化,编写高效C代码的要求,了解哪些方面编译器是保守的了解编译器对应的处理器体系结构,程序设计优化,二、数据类型对程序效率的影响,unsigned char i;for(i=0;i100;i+),i声明为unsigned char的优点?无符号字符变量表示的范围超过了100,可以完成题目要求。char更节省寄存器和内存空间。,程序设计优化,函数参数类型,总体思想:尽量采用int、long类型。,程序设计优化,有符号数和无符号数,如果程序中只有加、减、乘法,那么有符号数和无符号数的执行效率没有区别。如果有除法,那么需要额外的步骤。,程序设计优化,有符号数和无符号数(续),有符号除法,在ARM C中,如果x是负数,那么除2操作不是一个右移操作。例如-3/2=-1。但是在ARM机器中:,-3,-2,-1,直接右移,加1右移,程序设计优化,结论:,使用无符号数除法效率更高。,程序设计优化,对于存放在寄存器中的变量,尽量采用整型。尽可能使用无符号数进行运算。函数参数和返回值尽量采用整型数据。,总结,程序设计优化,三、循环方式对程序效率的影响,循环是代码优化的重点C程序主要使用for和while进行循环,程序设计优化,固定次数的循环,什么是ARM上编写for循环最高效的方法?,程序设计优化,固定次数的循环(续),int i;for(i=0;i100;i+),int i;for(i=100;i0;i-),上面代码要实现转移需要两条指令,首先把某寄存器的内容和100比较,其次条件符合时转移。相同功能的代码如果写作下面形式,则可用“BNE”一条指令实现比较以及转移两个功能。,程序设计优化,至少一次循环,对于“for(;n0;n-)”,如果能确保第一次循环之前n恒大于0,此时取消第一次n大于0的判断,是不会影响程序的逻辑,而且显然程序执行效率可以提高,用dowhile循环可以达到这一目的,程序设计优化,循环展开,循环开销重复100次,假设每次循环开销占用4个时钟周期,循环体中的加法占用1个时钟周期,那么有效程序仅占CPU执行时间的20%,其余80%都是服务性开销,效率为1/5。,int i,t=0;for(i=100;i0;i-)t+;,程序设计优化,循环展开(续),int i,t=0;for(i=50;i0;i-)t+;t+;,每次循环开销4个时钟周期不变,但是有效程序占用2个时钟周期,也即效率提高到1/3。,程序设计优化,循环展开(续),问题:循环展开到什么程度?全部展开是否最优?要意识到循环展开是有代价的:增加程序的长度。循环体内代码越多,就越有可能造成cache失效所以在任何程度上展开循环要具体问题具体分析,在执行时间和代码量间找到一个最佳平衡点。,程序设计优化,总结:,循环计数递减。如确定循环次数大于1,那么用dowile。对于小循环体,可以循环展开。,程序设计优化,四、指针对程序效率的影响,别名当两个指针指向同一个对象时,这两个指针被称作该对象的别名。编译器的特点:不知道是否是别名编译器是悲观的,程序设计优化,指针对程序效率的影响(续),void throwtobag(int*mybag,int*yourbag,int*stone)*mybag+=*stone;/语句1*yourbag+=*stone;/语句2,站在编译器的角度思考一下有无问题?,程序设计优化,指针对程序效率的影响(续),上面代码的语句1被GCC编译时,会出现诸如“LDR ri,r2,#0”之类汇编指令,表示首先要从stone指向的地址读出一个数据,以便来把它加到mybag指向指明的地址处。此处r2代表stone,因为它是函数的第三个参数,轮到r2来承载它。令人惊奇的是,编译语句2时,仍然包含一条“LDR ri,r2,#0”语句,stone的值不是已经由语句1得到了吗?为什么还要这一条语句?,程序设计优化,指针对程序效率的影响(续),讨论:编译器不会自动识别指针指向的对象不知道是否是别名悲观、保守思考:采用什么办法可以避免读两次内存?,程序设计优化,五、边界对齐对程序的影响,边界对齐问题_packed关键字,程序设计优化,边界对齐问题,对齐问题对结构体也有影响。在结构体中定义若干变量如果长短相间,由于对齐问题,势必浪费一些空间。例如一个整形变量和一个字符变量放在一起,总共占用8个字节空间,但是其中保存有效数据的只有5个字节。所以可以采用这种策略:在结构体的最前面定义的所有的字符型变量,中间定义所有的短整型变量,最后定义所有的整形变量,可以把浪费的空间减到最小。,程序设计优化,_packed关键字,有的C编译器支持_packed关键字,它可以突破边界对齐的限制,在任意类型的变量按照任意顺序定义的情况下,都能够紧凑的安排存储空间,此时的代价是牺牲程序的运行效率,程序设计优化,_packed关键字(续),代码完成从任意地址p处读取一个整型变量,且不要求此地址是4的整数倍,返回值为此地址起始的4字节数据。,int fetchint(_packed int*p)return*p;,程序设计优化,_packed关键字(续),上图是上述代码的实例,数据按照小端存储,读取一个没有对齐的整型数据。,

    注意事项

    本文(程序设计优化.ppt)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开