论文部分内容阅读
【摘要】对程序进行优化,通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个矛盾的统一,一般是优化了代码的尺寸,就会带来执行时间的增加,如果优化了程序的执行速度,通常会带来代码增加的副作用,很难鱼与熊掌兼得,只能在设计时掌握一个平衡点。
【关键词】标识符;表达式;函数;全局变量;局部变量
【Abstract】Carries on the optimization to the procedure, usually is refers to the optimized procedure code or the procedure carries out the speed. The optimized code and the optimized speed are in fact gives the shield the unification, generally optimized the code size, could bring the execution time the increase, if optimized the procedure to carry out the speed, usually could bring the side effect which the code increased, the very difficult fish and the bear’s paws concurrently,only could when the design grasped a balance point.
【Key words】Identifier;Expression; Function; Overall situation variable; Partialvariable
1.引言
C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。当今很多场合都用到了C程序,比如全国计算机等级考试。如何让C程序更优化,下面是我的几个观点。
2.程序结构的优化
2.1 程序的书写结构:虽然书写格式并不会影响生成的代码质量,但是在实际编写程序时还是应该尊循一定的书写规则,一个书写清晰、明了的程序,有利于以后的维护。在书写程序时,特别是对于While、for、do…while、if…else、switch…case等语句或这些语句嵌套组合时,应采用“缩格”的书写形式。
2.2 标识符:程序中使用的用户标识符除要遵循标识符的命名规则以外,一般不要用代数符号(如a、b、x1、y1)作为变量名,应选取具有相关含义的英文单词(或缩写)或汉语拼音作为标识符,以增加程序的可读性。
2.3 程序结构:C语言是一种高级程序设计语言,提供了十分完备的规范化流程控制结构。因此在采用C语言设计单片机应用系统程序时,首先要注意尽可能采用结构化的程序设计方法,这样可使整个应用系统程序结构清晰,便于调试和维护。对于一个较大的应用程序,通常将整个程序按功能分成若干个模块,不同模块完成不同的功能。各个模块可以分别编写,甚至还可以由不同的程序员编写,一般单个模块完成的功能较为简单,设计和调试也相对容易一些。在C语言中,一个函数就可以认为是一个模块。对于一些常用的功能模块,还可以封装为一个应用程序库,以便需要时可以直接调用。但是在使用模块化时,如果将模块分得太细太小,又会导致程序的执行效率变低。
2.4 定义常数:在程序化设计过程中,对于经常使用的一些常数,如果将它直接写到程序中去,一旦常数的数值发生变化,就必须逐个找出程序中所有的常数,并逐一进行修改,这样必然会降低程序的可维护性。因此,应尽量采用预处理命令方式来定义常数,而且还可以避免输入错误。
2.5 表达式:对于一个表达式中各种运算执行的优先顺序不太明确或容易混淆的地方,应当采用圆括号明确指定它们的优先顺序。一个表达式通常不能写得太复杂,如果表达式太复杂,时间久了以后,自己也不容易看得懂,不利于以后的维护。
2.6 函数:对于程序中的函数,在使用之前,应对函数的类型进行说明,对函数类型的说明必须保证它与原来定义的函数类型一致,对于没有参数和没有返回值类型的函数应加上“void”说明。如果需要缩短代码的长度,可以将程序中一些公共的程序段定义为函数。如果需要缩短程序的执行时间,在程序调试结束后,将部分函数用宏定义来代替。
3.代码的优化
3.1 选择合适的算法和数据结构:应该熟悉算法语言,知道各种算法的优缺点,将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序,都可以大大提高程序执行的效率。选择一种合适的数据结构也很重要,比如在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。
3.2 使用指针:数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。
3.3 使用尽量小的数据类型:能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。
设定使用printf参数,尽量使用基本型参数(%c、%d、%x、%X、%u和%s格式说明符),少用长整型参数(%ld、%lu、%lx和%lX格式说明符),至于浮点型的参数(%f)则尽量不要使用,使用%f参数,会使生成的代码的数量增加很多,执行速度降低。
3.4 使用自加、自减指令:通常使用自加、自减指令和复合赋值表达式(如a-=1及a+=1等)都能够生成高质量的程序代码,而使用a=a+1或a=a-1之类的指令,有很多C编译器都会生成二到三个字节的指令。
3.5 减少运算的强度:可以使用运算量小但功能相同的表达式替换原来复杂的表达式。如下:
求余运算:
a=a%8;
可以改为:
a=a&7;
说明:位操作只需一个指令周期即可完成,而大部分的C编译器的“%”运算均是调用子程序来完成,代码长、执行速度慢。通常,只要是求2n方的余数,均可使用位操作的方法来代替。
3.6 查表:在程序中一般不进行非常复杂的运算,如浮点数的乘除及开方等,对这些即消耗时间又消费资源的运算,应尽量使用查表的方式,并且将数据表置于程序存储区。如果直接生成所需的表比较困难,也尽量在启动时先计算,然后在数据存储器中生成所需的表,后以在程序运行直接查表就可以了,减少了程序执行过程中重复计算的工作量。
4.结束语
关于优化程序的方法还有很多。以上是本人学习C语言的几点观点,仅供大家参考。
参考文献
[1] 谭浩强.C程序设计.清华大学出版社
[2] 严蔚敏.数据结构.清华大学出版社
【关键词】标识符;表达式;函数;全局变量;局部变量
【Abstract】Carries on the optimization to the procedure, usually is refers to the optimized procedure code or the procedure carries out the speed. The optimized code and the optimized speed are in fact gives the shield the unification, generally optimized the code size, could bring the execution time the increase, if optimized the procedure to carry out the speed, usually could bring the side effect which the code increased, the very difficult fish and the bear’s paws concurrently,only could when the design grasped a balance point.
【Key words】Identifier;Expression; Function; Overall situation variable; Partialvariable
1.引言
C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。当今很多场合都用到了C程序,比如全国计算机等级考试。如何让C程序更优化,下面是我的几个观点。
2.程序结构的优化
2.1 程序的书写结构:虽然书写格式并不会影响生成的代码质量,但是在实际编写程序时还是应该尊循一定的书写规则,一个书写清晰、明了的程序,有利于以后的维护。在书写程序时,特别是对于While、for、do…while、if…else、switch…case等语句或这些语句嵌套组合时,应采用“缩格”的书写形式。
2.2 标识符:程序中使用的用户标识符除要遵循标识符的命名规则以外,一般不要用代数符号(如a、b、x1、y1)作为变量名,应选取具有相关含义的英文单词(或缩写)或汉语拼音作为标识符,以增加程序的可读性。
2.3 程序结构:C语言是一种高级程序设计语言,提供了十分完备的规范化流程控制结构。因此在采用C语言设计单片机应用系统程序时,首先要注意尽可能采用结构化的程序设计方法,这样可使整个应用系统程序结构清晰,便于调试和维护。对于一个较大的应用程序,通常将整个程序按功能分成若干个模块,不同模块完成不同的功能。各个模块可以分别编写,甚至还可以由不同的程序员编写,一般单个模块完成的功能较为简单,设计和调试也相对容易一些。在C语言中,一个函数就可以认为是一个模块。对于一些常用的功能模块,还可以封装为一个应用程序库,以便需要时可以直接调用。但是在使用模块化时,如果将模块分得太细太小,又会导致程序的执行效率变低。
2.4 定义常数:在程序化设计过程中,对于经常使用的一些常数,如果将它直接写到程序中去,一旦常数的数值发生变化,就必须逐个找出程序中所有的常数,并逐一进行修改,这样必然会降低程序的可维护性。因此,应尽量采用预处理命令方式来定义常数,而且还可以避免输入错误。
2.5 表达式:对于一个表达式中各种运算执行的优先顺序不太明确或容易混淆的地方,应当采用圆括号明确指定它们的优先顺序。一个表达式通常不能写得太复杂,如果表达式太复杂,时间久了以后,自己也不容易看得懂,不利于以后的维护。
2.6 函数:对于程序中的函数,在使用之前,应对函数的类型进行说明,对函数类型的说明必须保证它与原来定义的函数类型一致,对于没有参数和没有返回值类型的函数应加上“void”说明。如果需要缩短代码的长度,可以将程序中一些公共的程序段定义为函数。如果需要缩短程序的执行时间,在程序调试结束后,将部分函数用宏定义来代替。
3.代码的优化
3.1 选择合适的算法和数据结构:应该熟悉算法语言,知道各种算法的优缺点,将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序,都可以大大提高程序执行的效率。选择一种合适的数据结构也很重要,比如在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。
3.2 使用指针:数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。
3.3 使用尽量小的数据类型:能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。
设定使用printf参数,尽量使用基本型参数(%c、%d、%x、%X、%u和%s格式说明符),少用长整型参数(%ld、%lu、%lx和%lX格式说明符),至于浮点型的参数(%f)则尽量不要使用,使用%f参数,会使生成的代码的数量增加很多,执行速度降低。
3.4 使用自加、自减指令:通常使用自加、自减指令和复合赋值表达式(如a-=1及a+=1等)都能够生成高质量的程序代码,而使用a=a+1或a=a-1之类的指令,有很多C编译器都会生成二到三个字节的指令。
3.5 减少运算的强度:可以使用运算量小但功能相同的表达式替换原来复杂的表达式。如下:
求余运算:
a=a%8;
可以改为:
a=a&7;
说明:位操作只需一个指令周期即可完成,而大部分的C编译器的“%”运算均是调用子程序来完成,代码长、执行速度慢。通常,只要是求2n方的余数,均可使用位操作的方法来代替。
3.6 查表:在程序中一般不进行非常复杂的运算,如浮点数的乘除及开方等,对这些即消耗时间又消费资源的运算,应尽量使用查表的方式,并且将数据表置于程序存储区。如果直接生成所需的表比较困难,也尽量在启动时先计算,然后在数据存储器中生成所需的表,后以在程序运行直接查表就可以了,减少了程序执行过程中重复计算的工作量。
4.结束语
关于优化程序的方法还有很多。以上是本人学习C语言的几点观点,仅供大家参考。
参考文献
[1] 谭浩强.C程序设计.清华大学出版社
[2] 严蔚敏.数据结构.清华大学出版社