1、选择合适的算法和数据结构
应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有
很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找
法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大
提高程序执行的效率。.选择一种合适的数据结构也很重要,比如你在一堆随机存
放的数中使用了大量的插入和删除指令,那使用链表要快得多。
数组与指针语句具有十分密码的关系,一般来说,指针比较灵活简洁,而数组则比
较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,
执行效率更高。但是在Keil中则相反,使用数组比使用的指针生成的代码更短。。
3、使用尽量小的数据类型
能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用
整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就
不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变
量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误很难
发现。
在ICCAVR中,可以在Options中设定使用printf参数,尽量使用基本型参数(%c、
%d、%x、%X、%u和%s格式说明符),少用长整型参数(%ld、%lu、%lx和%lX格式说明
符),至于浮点型的参数(%f)则尽量不要使用,其它C编译器也一样。在其它条件不
变的情况下,使用%f参数,会使生成的代码的数量增加很多,执行速度降低。
4、使用自加、自减指令
通常使用自加、自减指令和复合赋值表达式(如a-=1及a+=1等)都能够生成高质量的
程序代码,编译器通常都能够生成inc和dec之类的指令,而使用a=a+1或a=a-1之类
的指令,有很多C编译器都会生成二到三个字节的指令。在AVR单片适用的ICCAVR、
GCCAVR、IAR等C编译器以上几种书写方式生成的代码是一样的,也能够生成高质量
的inc和dec之类的的代码。
5、减少运算的强度
可以使用运算量小但功能相同的表达式替换原来复杂的的表达式。如下:
(1)、求余运算。
a=a%8;
可以改为:
a=a&7;
说明:位操作只需一个指令周期即可完成,而大部分的C编译器的“%”运算均是调
用子程序来完成,代码长、执行速度慢。通常,只要求是求2n方的余数,均可使用
位操作的方法来代替。
(2)、平方运算
a=pow(a,2.0);
可以改为:
a=a*a;
说明:在有内置硬件乘法器的单片机中(如51系列),乘法运算比求平方运算快得多
,因为浮点数的求平方是通过调用子程序来实现的,在自带硬件乘法器的AVR单片
机中,如ATMega163中,乘法运算只需2个时钟周期就可以完成。既使是在没有内置
硬件乘法器的AVR单片机中,乘法运算的子程序比平方运算的子程序代码短,执行
速度快。
如果是求3次方,如:
a=pow(a,3.0);
更改为:
a=a*a*a;
则效率的改善更明显。
(3)、用移位实现乘除法运算
a=a*4;
b=b/4;
可以改为:
a=a<<2;
b=b>>2;
说明:通常如果需要乘以或除以2n,都可以用移位的方法代替。在ICCAVR中,如果
乘以2n,都可以生成左移的代码,而乘以其它的整数或除以任何数,均调用乘除法
子程序。用移位的方法得到代码比调用乘除法子程序生成的代码效率高。实际上,
只要是乘以或除以一个整数,均可以用移位的方法得到结果,如:
a=a*9
可以改为:
a=(a<<3)+a
6、循环
(1)、循环语
对于一些不需要循环变量参加运算的任务可以把它们放到循环外面,这里的任务包
括表达式、函数的调用、指针运算、数组访问等,应该将没有必要执行多次的操作
全部集合在一起,放到一个init的初始化程序中进行。
(2)、延时函数:
通常使用的延时函数均采用自加的形式:
void delay (void)
{
unsigned int i;
for (i=0;i<1000;i++)
;
}
将其改为自减延时函数:
void delay (void)
{
unsigned int i;
for (i=1000;i>0;i--)
;
}
两个函数的延时效果相似,但几乎所有的C编译对后一种函数生成的代码均比前一
种代码少1~3个字节,因为几乎所有的MCU均有为0转移的指令,采用后一种方式能
够生成这类指令。
在使用while循环时也一样,使用自减指令控制循环会比使用自加指令控制循环生
成的代码更少1~3个字母。
但是在循环中有通过循环变量“i”读写数组的指令时,使用预减循环时有可能使
数组超界,要引起注意。
(3)while循环和do…while循环
用while循环时有以下两种循环形式:
unsigned int i;
i=0;
while (i<1000)
{
i++;
//用户程序
}
或:
unsigned int i;
i=1000;
do
i--;
//用户程序
while (i>0);
在这两种循环中,使用do…while循环编译后生成的代码的长度短于while循环。
7、查表
在程序中一般不进行非常复杂的运算,如浮点数的乘除及开方等,以及一些复杂的
数学模型的插补运算,对这些即消耗时间又消费资源的运算,应尽量使用查表的方
式,并且将数据表置于程序存储区。如果直接生成所需的表比较困难,也尽量在启
了,减少了程序执行过程中重复计算的工作量。
8、其它
比如使用在线汇编及将字符串和一些常量保存在程序存储器中,均有利于优化
关键字:优化 C语言 代码
引用地址:
如何优化C语言代码
推荐阅读最新更新时间:2024-03-16 13:52
红外线遥控器软件解码原理和程序(C语言)
红外线一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲,本程序来自网络,版权归源作者所有,仅做学习交流之用!不得用于商业目的,本程序经过试用,能解大部分遥控器的编码! #include at89x52.h #define NULL 0x00//数据无效 #define RESET 0X01//程序复位 #define REQUEST 0X02//请求信号 #define ACK 0x03//应答信号,在接收
[单片机]
基于单片机的红外发射C语言程序
#include reg52.h sbit P3_4 = P2^1; static bit OP; //红外发射管的亮灭 static unsigned int count; //延时计数器 static unsigned int endcount; //终止延时计数 static unsigned char flag; //红外发送标志 char iraddr1; //十六位地址的第一个字节 char iraddr2; //十六位地址的第二个字节 void SendIRdata(char p_irdata); void delay(); void main(void) { count = 0; fl
[单片机]
IAR Embedded Workbench for Arm 9.40版本通过集成PACBTI来提升代码安全性
IAR Embedded Workbench 9.40版本引入了与指针验证和分支目标识别(PACBTI)扩展的无缝兼容性,保护嵌入式应用程序免受各种安全攻击。 瑞典乌普萨拉–2023年6月7日-嵌入式软件和服务的全球领导者IAR发布了备受欢迎的IAR Embedded Workbench for Arm v9.40版本,最新版本引入了针对代码安全的 增强功能: 添加了针对Armv8.1-M专用的指针验证和分支目标识别(PACBTI)扩展。 通过PACBTI,用户应用程序可以通过加密签名来增强防护,有效防止攻击者控制整个系统。新版本还提供了更强大、更智能的IDE Build Actions,可为软件工程师带来更好的开发体验。
[嵌入式]
英特尔雅典娜开放实验室计划,全面优化笔记本电脑组件
英特尔今天公布了将在台北、上海和加利福尼亚 Folsom 建立雅典娜计划(Project Athena) 开放实验室的计划。该计划将支持厂商对笔记本电脑组件进行性能和低功耗优化,打造符合 2020 年雅典娜计划(Project Athena)设计规范和目标体验的高级笔记本电脑。这三家开放实验室位于主要生态系统枢纽,由擅长系统级芯片 (SOC) 和平台功耗优化的英特尔工程师团队负责运营。这些实验室将于 2019 年 6 月投入运营,致力于支持和优化笔记本电脑组件。 “纵观整个行业,无论是现在还是将来,每家企业在优化和增强笔记本电脑方面都发挥了重要作用。雅典娜计划(Project Athena)开放实验室为与组件生态系统实现广泛而
[手机便携]
单片机中C语言延时函数
单片机C语言延时程序计算2009-11-02 22:15单片机C语言延时程序用C语言写出来程序非常的简练,它是一种模块化的语言,一种比汇编更高级的语言,但是就是这样一种语言也还是有它不足之处:它的延时很不好控制,我们常常很难知道一段延时程序它的精确延时到底是多少,这和汇编延时程序没法比。但有时后写程序又不得不要用到比较精确的延时,虽然说可以用混合编程的方式解决,但这种方式不是每个人都能掌握,且写起来也麻烦。所以,通过测试我给大家提供一个延时子程序模块,并以此给一个出我们经常用到的延时的数据表格。(注意:表格中的数据只适合我的延时模块,对其他的延时程序不适用,切忌!!!!!!!!别到时候延时不对来骂我) 延时模块:其中问号代
[单片机]
送餐机器人可以优化就餐体验和提高服务效率
(文章来源:中国经济新闻网) 近两年来,各大餐饮品牌纷纷利用选择科技元素作为餐饮的流量入口,其中,综合跑堂传菜、回收餐具、引流聚客、互动吸粉的送餐机器人受到越来越多餐饮品牌的青睐。作为地道北京菜餐厅、最具人气餐饮品牌之一的局气餐厅,也积极引进餐饮机器人行业拇指企业擎朗智能推出的爆款送餐机器人“花生”,着力智能化升级,打造成为最具地域特色的潮流、趣味、艺术的餐饮聚合地。 2019年,是餐饮业的又一分水岭。我国餐饮收入首次突破4万亿元大关,大众餐饮爆发的同时,给专业餐厅创造了巨大的增量空间。但和前几年中国餐饮品牌的大肆扩张相比,今年的节奏慢了下来,随之而来的是反思和革新:如何利用人工智能等新技术,构建出一套完全不同于传统的消
[机器人]
优化摄像头和拍照功能,小米在芬兰注册了研发中心
近日,据外媒报道,小米在芬兰坦佩雷注册了一家研发中心,正式注册名为Xiaomi Finland Oy,同时小米芬兰公司首席执行官David Arthur Felix被任命为此研发公司的总经理。 据外媒表示,小米此举可能是想借此机会在芬兰“取经”,利用当地丰富的摄影家资源进一步优化自家产品的摄像头及拍照功能。预计小米在芬兰的新公司将专注于产品开发,初期将主攻相机技术。 芬兰作为诺基亚的老家,长期以来培养留驻了大量的工程师,尤其是影像工程师和相关团队。早在2016年,华为同样入驻芬兰坦佩雷设立了研发中心,同时吸纳了此前大量诺基亚影像团队的工程师。 此外,小米芬兰研发公司的注册成立可能与此前小米和诺基亚签署的一项合作协议有关。 在2
[手机便携]
OneSpin揭最新FPGA校验方案神秘面纱
EDA软件商OneSpin Solutions GmbH公司引进序列等价验证方案,该方案致力于FPGA综合验证。 OneSpin Solutions公司声称其360 EC-FPGA等价校验器使设计者可以结合高级综合优化进行功能验证,高级综合优化在功能、性能和成本目标方面不可或缺。此等价校验器还称能在寄存器转移水平代码和后综合FPGA网表之间验证功能等效性,也可以在后综合表单和后布局布线FPGA网表之间验证功能等效性。 OneSpin公司补充说其方案旨在利用全部实施阶段,检测错误,失配上引进复杂的FPGA综合优化来维护设计功能。该方案同时支持原型和产品部件验证。该公司指出。 “复杂,高度优化的FPGA设计要使用等价验证,设计者
[新品]