仓酷云
标题:
IOS制作之嵌进式及时程序计划中C/C++代码的优化仓酷云
[打印本页]
作者:
莫相离
时间:
2015-1-18 11:51
标题:
IOS制作之嵌进式及时程序计划中C/C++代码的优化仓酷云
Model的改变最好通过Notification来传播之前吃过这样的亏最好不要用delegate模式)UIViewController1弁言
盘算机手艺和信息手艺的高速开展的明天,盘算机和盘算机手艺大批使用在人们的一样平常生存中,嵌进式盘算机也失掉了普遍的使用。嵌进式盘算机是指完成一种或多种特定功效的盘算机体系,是软硬件的严密分离体。具有软件代码小、高度主动化、呼应速率快等特性。出格合适于请求及时和多义务的使用系统。嵌进式及时体系是今朝兴旺开展的行业之一。可是,及时嵌进式体系的特性使得其软件受工夫和空间的严厉限定,加上运转情况庞大,使得嵌进式体系软件的开辟变得非常坚苦。为了计划一个满意功效、功能和逝世线请求的体系,为了开辟出平安牢靠的高功能嵌进式体系,开辟言语的选择非常主要。
2嵌进式及时程序计划中言语的选择
跟着嵌进式体系使用局限的不休扩展和嵌进式及时操纵体系RTOS(RealTimeOperatingSystem)的普遍利用,初级言语编程已经是嵌进式体系计划的一定趋向。由于汇编言语和详细的微处置器的硬件布局亲切相干,移植性较差,既不宜在庞大体系中利用,又方便于完成软件重用;而初级言语具有优秀的通用性和丰厚的软件撑持,便于推行、易于保护,因而初级言语编程具有很多上风。今朝,在嵌进式体系开辟过程当中利用的言语品种良多,但唯一多数几种言语失掉了对照普遍的使用。个中C和C++是使用最普遍的。C++在撑持古代软件工程、OOP(ObjectOrientedProgramming,面向对象的程序计划)、布局化等方面临C举行了行之有效的改善,但在程序代码容量、实行速率、程序庞大水平等方面比C言语程序功能差一些。因为C言语既有初级言语的间接把持硬件的才能,又有初级言语的天真性,是今朝在嵌进式体系中使用最普遍的编程言语。跟着收集手艺和嵌进式手艺的不休开展,Java的使用也失掉普遍使用。
3C/C++代码在及时程序计划中的优化
固然使软件准确是一个工程符合逻辑的最初一个步骤,可是在嵌进式的体系开辟中,情形其实不老是如许的。出于对低价产物的需求,硬件的计划者必要供应恰好充足的存储器和完成事情的处置才能。以是在嵌进式软件计划的最初一个阶段则酿成了对代码的优化。
古代的C和C++编译器都供应了必定水平上的代码优化。但是,年夜部分由编译器实行的优化仅触及实行速率和代码巨细的一个均衡。你的程序可以变得更快大概更小,可是不成能又变快又变小。经由自己在嵌进式体系计划和完成过程当中理论,上面先容几种复杂且卓有成效的C/C++代码的优化办法。
(1)Inline函数
在C++中,关头字Inline能够被到场就任何函数的声明中。这个关头字哀求编译器用函数外部的代码交换一切关于指出的函数的挪用。如许做在两个方面快于函数挪用。如许做在两个方面快于函数挪用:第一,省往了挪用指令必要的实行工夫;第二,省往了传送变元和传送历程必要的工夫。可是利用这类办法在优化程序速率的同时,程序长度变年夜了,因而必要更多的ROM。利用这类优化在Inline函数频仍挪用而且只包括几行代码的时分是最无效的。
(2)用指针取代数组
在很多种情形下,能够用指针运算取代数组索引,如许做经常能发生又快又短的代码。与数组索引比拟,指针一样平常能使代码速率更快,占用空间更少。利用多维数组时差别更分明。上面的代码感化是不异的,可是效力纷歧样。
数组索引指针运算
For(;;){p=array
A=array[t++];for(;;){
a=*(p++);
............
}}
指针办法的长处是,array的地点每次装上天址p后,在每次轮回中只需对p增量操纵。在数组索引办法中,每次轮回中都必需举行基于t值求数组下标的庞大运算。
(3)不界说不利用的前往值
function函数界说其实不晓得函数前往值是不是被利用,假设前往值历来不会被用到,应当利用void来明白声明函数不前往任何值。
(4)手动编写汇编
在嵌进式软件开辟中,一些软件模块最好用汇编言语来写,这可使程序加倍无效。固然C/C++编译器对代码举行了优化,可是得当的利用内联汇编指令能够无效的进步全部体系运转的效力。
(5)利用存放器变量
在声明部分变量的时分可使用register关头字。这就使得编译器把变量放进一个多用处的存放器中,而不是在仓库中,公道利用这类办法能够进步实行速率。函数挪用越是频仍,越是大概进步代码的速率。
(6)利用增量和减量操纵符
在利用到加一和减一操纵时只管利用增量和减量操纵符,由于增量符语句比赋值语句更快,缘故原由在于对年夜多半CPU来讲,对内存字的增、减量操纵不用分明地利用取内存和写内存的指令,好比上面这条语句:
x=x+1;
仿照年夜多半微机汇编言语为例,发生的代码相似于:
moveA,x;把x从内存掏出存进累加器A
addA,1;累加器A加1
storex;把新值存回x
假如利用增量操纵符,天生的代码以下:
incrx;x加1
明显,不必取指令和存指令,增、减量操纵实行的速率加速,同时长度也延长了。
(7)削减函数挪用参数
利用全局变量比函数传送参数加倍无效率。如许做往除函数挪用参数进栈和函数完成后参数出栈所必要的工夫。但是决意利用全局变量会影响程序的模块化和重进,故要稳重利用。
(8)Switch语句中依据产生频次来举行case排序
switch语句是一个一般的编程手艺,编译器会发生if-else-if的嵌套代码,并依照按次举行对照,发明婚配时,就跳转到满意前提的语句实行。利用时必要注重。每个由呆板言语完成的测试和跳转仅仅是为了决意下一步要做甚么,就把可贵的处置器工夫耗尽。为了进步速率,没法把详细的情形依照它们产生的绝对频次排序。换句话说,把最大概产生的情形放在第一名,最不成能的情形放在最初。
(9)将年夜的switch语句转为嵌套switch语句
当switch语句中的case标号良多时,为了削减对照的次数,明智的做法是把年夜switch语句转为嵌套switch语句。把产生频次高的case标号放在一个switch语句中,而且是嵌套switch语句的最外层,产生绝对频次绝对低的case标号放在另外一个switch语句中。好比,上面的程序段把绝对产生频次低的情形放在缺省的case标号内。pMsg=ReceiveMessage();
switch(pMsg->type)
{
caseFREQUENT_MSG1:
handleFrequentMsg();
break;
caseFREQUENT_MSG2:
handleFrequentMsg2();
break;
......
caseFREQUENT_MSGn:
handleFrequentMsgn();
break;
default://嵌套部分用来处置不常常产生的动静
switch(pMsg->type)
{
caseINFREQUENT_MSG1:
handleInfrequentMsg1();
break;
caseINFREQUENT_MSG2:
handleInfrequentMsg2();
break;
......
caseINFREQUENT_MSGm:
handleInfrequentMsgm();
break;
}
}
假如switch中每种情形下都有良多的事情要做,那末把全部switch语句用一个指向函数指针的表来交换会加倍无效,好比上面的switch语句,有三种情形:
enumMsgType{Msg1,Msg2,Msg3}
switch(ReceiveMessage()
{
caseMsg1;
......
caseMsg2;
.....
caseMsg3;
.....
}
为了进步实行速率,用上面这段代码来交换这个下面的switch语句。
/*筹办事情*/
inthandleMsg1(void);
inthandleMsg2(void);
inthandleMsg3(void);
/*创立一个函数指针数组*/
int(*MsgFunction[])()={handleMsg1,handleMsg2,handleMsg3};
/*用上面这行更无效的代码来交换switch语句*/
status=MsgFunction[ReceiveMessage()]();
(10)制止利用C++的高贵特征
C++在撑持古代软件工程、OOP、布局化等方面临C举行了行之有效的改善,但在程序代码容量、实行速率、程序庞大水平等方面比C言语程序功能差一些。并非一切的C++特征都是肮贵的。好比,类的界说是完整无益的。私有和公有成员数据及函数的列表与一个struct及函数本相的列表并没有多年夜的不同。纯真的到场类既不会影响代码的巨细,也不会影响程序的效力。但C++的多重承继、假造基类、模板、非常处置及运转范例辨认等特征对代码的巨细和效力有负面的影响,因而关于C++的一些特征要稳重利用,可做些实行看看它们对使用程序的影响。
4总结语
在嵌进式及时程序计划时能够使用下面先容的一种或多种手艺来优化代码。下面先容的办法次要是为了进步代码的效力。可是现实上,在利用这些手艺进步代码运转速率的同时会响应的发生一些负面的影响,好比增添代码的巨细、下降程序可读性等。不外你可让C/C++编译器来举行削减代码巨细的优化,而手动使用以上手艺来削减代码的实行工夫。在嵌进式程序计划中公道地利用这几种手艺偶然会到达很好的优化效果。
原文链接:http://blog.csdn.net/nhczp/archive/2006/09/22/1264359.aspx
Model的改变最好通过Notification来传播之前吃过这样的亏最好不要用delegate模式)UIViewController
作者:
若相依
时间:
2015-1-21 16:21
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
作者:
精灵巫婆
时间:
2015-1-30 21:04
AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
作者:
飘灵儿
时间:
2015-2-3 11:53
还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。
作者:
海妖
时间:
2015-2-8 20:25
边吃零食边看Stanford的视频教程
作者:
第二个灵魂
时间:
2015-2-9 02:25
首先是基础,在汉昌的课程非常全面。从object—c到最后的毕业项目,基本上方方面面都涉及到了,我是一名非计算机专业的学生,起初学习还有点吃力,因为基础知识薄弱。经常像听天书
作者:
愤怒的大鸟
时间:
2015-2-17 15:51
最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。
作者:
不帅
时间:
2015-3-5 20:40
以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。
作者:
若天明
时间:
2015-3-6 20:50
同很多iOS开发者一样,我也是通过培训进入到iOS开发这个行业,开始没有打算培训,只准备自己学习一些计算机编程相关的知识,毕业时找一份编程相关工作(本人是信息与计算科学这个专业,是数学系)。
作者:
小妖女
时间:
2015-3-6 22:14
这个办法就是在WindowsXP或Win7的电脑上,使用vmware虚拟机来搭建一个真实的Mac OS X环境。
作者:
灵魂腐蚀
时间:
2015-3-10 23:17
开始的时候甚至想放弃,不过想想自己的未来,只能咬牙坚持,课下就不停的缠着老师。放学就补基础,这些基础的东西没有速成的,只有刻苦努力。我是后来发现的,转变自己的心态,不要读书看资料当成一种痛苦
作者:
山那边是海
时间:
2015-3-12 13:37
down下code4app网站的每个分类的代码挨着看
作者:
蒙在股里
时间:
2015-3-16 08:20
iPhone文件系统:创建、重命名以及删除文件,NSFileManager中包含了用来查询单词库目录、创建、重命名、删除目录以及获取/设置文件属性的方法(可读性,可编写性等等)。
作者:
仓酷云
时间:
2015-3-22 21:19
down下code4app网站的每个分类的代码挨着看
作者:
乐观
时间:
2015-3-24 17:07
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
作者:
老尸
时间:
2015-3-25 00:01
从C语言入门,因为IOS开发用的是OC语言,是在C基础上的,不过也跟C不是很搭界,你可以直接学习OC语言也可以,
作者:
小女巫
时间:
2015-4-11 02:12
以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。
作者:
变相怪杰
时间:
2015-4-11 04:11
其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。
作者:
透明
时间:
2015-4-22 02:29
其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。
作者:
小魔女
时间:
2015-4-26 18:11
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
作者:
爱飞
时间:
2015-5-3 13:26
down下code4app网站的每个分类的代码挨着看
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2