第一招:以空间换时间
计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值:
方法A:通常的办法
#defineLEN32charstring1[LEN];
memset(string1,0,LEN);
strcpy(string1,"Thisisaexample!!");
方法B:
constcharstring2[LEN]="Thisisaexample!";
char*cp;
cp=string2;
使用的时候可以直接用指针来操作。
从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。
如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。
第二招: 使用宏而不是函数。
这也是第一招的变招。函数和宏的区别就在于,宏占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选 项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一 些CPU时间。 而宏不存在这个问题。宏仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏的时候,该现象尤其突出。
举例如下:
方法C:
#definebwMCDR2_ADDRESS4#definebsMCDR2_ADDRESS17
intBIT_MASK(int__bf)
{
return((1U<<(bw##__bf))-1)<<(bs##__bf);
}
voidSET_BITS(int__dst,
int__bf,int__val)
{
__dst=((__dst)&~(BIT_MASK(__bf)))|
(((__val)<<(bs##__bf))
&(BIT_MASK(__bf))))
}
SET_BITS(MCDR2,MCDR2_ADDRESS,ReGISterNumber);
方法D:
#definebwMCDR2_ADDRESS4#definebsMCDR2_ADDRESS17
#definebmMCDR2_ADDRESSBIT_MASK(MCDR2_ADDRESS)
#defineBIT_MASK(__bf)
(((1U<<(bw##__bf))-1)
<<(bs##__bf))
#defineSET_BITS(__dst,__bf,__val)
((__dst)=((__dst)&~(BIT_MASK(__bf)))
|
(((__val)<<(bs##__bf))
&(BIT_MASK(__bf))))
SET_BITS(MCDR2,MCDR2_ADDRESS,
RegisterNumber);
D方法是我看到的最好的置位操作函数,是arm公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C方法是其变体,其中滋味还需大家仔细体会。
第三招:数学方法解决问题
现在我们演绎高效C语言编写的第二招--采用数学方法来解决问题。数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。举例如下,求 1~100的和。
方法E:
intI,j;for(I=1;I<=100;I++)
{
j+=I;
}
方法F
intI;I=(100*(1+100))/2
这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式 N×(N+1)/ 2 来解决这个问题。方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1 次乘法,1次除法。效果自然不言而喻。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。
第四招:使用位操作
使用位操作。减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用"位运算"来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例如下:
方法G
intI,J;I=257/8;
J=456%32;
方法H
intI,J;I=257>>3;
J=456-(456>>4<<4);
在字面上好像H比G麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法G调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方法H则仅仅是几句相关的汇编,代码更简洁,效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,arm C 来看,效率的差距还是不小。
对于以2的指数次方为"*"、"/"或"%"因子的数学运算,转化为移位运算"<< >>"通常可以提高算法效率。因为乘除运算指令周期通常比移位运算大。
C语言位运算除了可以提高运算效率外,在嵌入式系统的编程中,它的另一个最典型的应用,而且十分广泛地正在被使用着的是位间的与(&)、或(|)、非(~)操作,这跟嵌入式系统的编程特点有很大关系。我们通常要对硬件寄存器进行位设置,譬如,我们通过将AM186ER型80186处理器的中断屏蔽控制寄存器的第低6位设置为0(开中断2),最通用的做法是:
#define INT_I2_MASK 0x0040
wTemp = inword(INT_MASK);
outword(INT_MASK, wTemp &~INT_I2_MASK);
而将该位设置为1的做法是:
#define INT_I2_MASK 0x0040
wTemp = inword(INT_MASK);
outword(INT_MASK, wTemp | INT_I2_MASK);
判断该位是否为1的做法是:
#define INT_I2_MASK 0x0040
wTemp = inword(INT_MASK);
if(wTemp & INT_I2_MASK)
{
… /* 该位为1 */
}
运用这招需要注意的是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。
第五招:汇编嵌入
在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾"。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法--嵌入汇编,混合编程。嵌入式C程序中主要使用在线汇编,即在C程序中直接插入_asm{ }内嵌汇编语句。
举例如下,将数组一赋值给数组二,要求每一字节都相符。
char string1[1024],string2[1024];
方法I
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I)
方法J
#ifdef _PC_
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I);
#else
#ifdef _arm_
__asm
{
MOV R0,string1
MOV R1,string2
MOV R2,#0
loop:
LDMIA R0!, [R3-R11]
STMIA R1!, [R3-R11]
ADD R2,R2,#8
CMP R2, #400
BNE loop
}
#endif
再举个例子:
/* 把两个输入参数的值相加,结果存放到另外一个全局变量中 */
int result;
void Add(long a, long *b)
{
_asm
{
MOV AX, a
MOV BX, b
ADD AX, [BX]
MOV result, AX
}
}
方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在arm平台下,用嵌入汇编仅用128次循环就完成了同样的操作。这里有朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作。这个例程典型应用于LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。
虽然是必杀技,但是如果轻易使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。
第六招, 使用寄存器变量
当对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量,而循环计数是应用寄存器变量的最好候选者。
(1) 只有局部自动变量和形参才可以定义为寄存器变量。因为寄存器变量属于动态存储方式,凡需要采用静态存储方式的量都不能定义为寄存器变量,包括:模块间全局变量、模块内全局变量、局部static变量;
(2) register是一个"建议"型关键字,意指程序建议该变量放在寄存器中,但最终该变量可能因为条件不满足并未成为寄存器变量,而是被放在了存储器中,但编译器中并不报错(在C++语言中有另一个"建议"型关键字:inline)。
下面是一个采用寄存器变量的例子:
/* 求1+2+3+….+n的值 */
WORD Addition(BYTE n)
{
register i,s=0;
for(i=1;i<=n;i++)
{
s=s+i;
}
return s;
}
本程序循环n次,i和s都被频繁使用,因此可定义为寄存器变量。
第七招: 利用硬件特性
首先要明白CPU对各种存储器的访问速度,基本上是:
CPU内部RAM > 外部同步RAM > 外部异步RAM > FLASH/ROM
对于程序代码,已经被烧录在FLASH或ROM中,我们可以让CPU直接从其中读取代码执行,但通常这不是一个好办法,我们最好在系统启动后将FLASH或ROM中的目标代码拷贝入RAM中后再执行以提高取指令速度;
对于UART等设备,其内部有一定容量的接收BUFFER,我们应尽量在BUFFER被占满后再向CPU提出中断。例如计算机终端在向目标机通过RS-232传递数据时,不宜设置UART只接收到一个BYTE就向CPU提中断,从而无谓浪费中断处理时间;
如果对某设备能采取DMA方式读取,就采用DMA读取,DMA读取方式在读取目标中包含的存储信息较大时效率较高,其数据传输的基本单位是块,而所传输的数据是从设备直接送入内存的(或者相反)。DMA方式较之中断驱动方式,减少了CPU 对外设的干预,进一步提高了CPU与外设的并行操作程度。
以上就是我总结的如何优化C代码的方法了。
做软件测试比程序员工作更难吗?
我不知道你要从哪个角度比较,但是从软件测试新手培训一个月就可以上岗工作,程序员可能没有这么快。而且软件测试的入门较容易,很多非计算机专业的朋友也在做测试,而且照样做的很好。所以,我个人认为测试比开发要容易一些,虽然待遇也有点差距,但是工作强度也不一样哈。测试大致分为黑盒测试和白盒测试,目前国内以黑盒测试为主,基本上不需要懂开发知识,现在一个有经验的黑盒测试,薪水也挺可观的。我做测试三年,学数学出身,有问题可以继续提问我。
软件工程的硕士,性格比较外向不喜欢闭门搞研究写代码,求指点我该往什么方向发展?
1、软件系统售前工程师,和客户交流需要外向型性格;
2、软件系统需求调研、咨询顾问,专门做用户需求分析和解决方案;
3、项目实施经理、项目实施顾问,负责实施大型软件系统上马、使用、完善等;
4、软件项目使用优化、诊断。
以上都是外向型性格才可以做的,不需要你自己有多高的开发能力,但是需要你懂软件开发整个过程、和测试、实施过程,非本行业的人无法胜任。
我是专业人员,给你最专业的回答,但是需要你做一定的经验积累,刚开始哪怕工资再低都要去积累,后面才能聚沙成搭,最后一个月赚别人一年的工资,也不是什么很稀奇的事情,这个行业顾问月薪5W以上,一点也不稀奇。
多谢您的回答。那麻烦您指教,如果我想朝着项目经理的方向发展,研究生期间我该如何提升自己?除了基础的编程能力,我还需要哪些方面的积累?谢谢
如何在嵌入式系统编程中优化 c 代码
因为汇编语言编写的代码难懂,从而不好维护和难于调试,且只能针对特定的体系结构和处理器移植性差,所以既不宜在复杂系统中使用,又不便于实现软件重用;而高级语言具有良好的通用性和丰富的软件支持,可移植性好、易于维护,因此高级语言编程具有许多优势。随着嵌入式系统应用范围的不断扩大和嵌入式实时操作系统RTOS(Real Time Operating System)的广泛使用,高级语言编程已是嵌入式系统设计的必然趋势。但是不排除一些软件模块仍用汇编语言来写,这可以使程序更加有效。虽然C/C++编译器对代码进行了优化,但是适当的使用内联汇编指令可以有效的提高整个系统运行的效率。目前,在嵌入式系统开发过程中使用的语言种类很多,但仅有少数几种语言得到了比较广泛的应用。其中C和C++是应用最广泛的。C++在支持现代软件工程、 OOP(Object Oriented Programming,面向对象的程序设计)、结构化等方面对C进行了卓有成效的改进,但在程序代码容量、执行速度、程序复杂程度等方面比C语言程序性能差一些。由于C语言既有低级语言的直接控制硬件的能力,又有高级语言的灵活性,是目前在嵌入式系统中应用最广泛的编程语言。随着网络技术和嵌入式技术的不断发展,Java的应用也得到广泛应用。
java 代码优化问题
这是一个很大的问题,因为这没有绝对的标准,我们在写类是要遵循六大原则,有单一职责,迪米特法则等等,依据这六大原则我们有23种设计模式,所以再设计好一个系统是需要经验的,我给你一个参考博客吧,他写的很不错:http://blog.csdn.net/zhengzhb/article/details/7331369
非常感谢,博客里的东西很详细
如何在网页代码中做优化
在SEO优化中,我们不仅要对关键字进行优化,代码优化也是必不可少的。
下面一些见解
网页代码优化的原因:
(1) 可以减少网页的体积,加快网页的下载速度;
(2) 提高蜘蛛对信息的抓取的速度和准确性
(3) 有利于减少错误的代码,提高页面的对蜘蛛的友好性
(4) 便于管理人员维护,提高工作效率
(5) 减少网页的噪音,突出页面的主题
那我们怎样对网页代码进行优化?
(1)对网页中存在多余的代码,我们要学会清除垃圾代码。网页中一般存在的垃圾代码会有空格符、空标签块、多余的嵌套标签、不必要的注释等。
如:在每行的开始或结尾都存在着大量的空格符,我们需要把这些冗余代码删除,还有空白行。清除空白行有一种简单快捷的方法:可以将代码转至html代码编
辑的模式按ctrl+A全选代码使用组合键shift+Tab删除。
(2)采用div+css排版。Div+css样式可以精简很多样式,将设计网页模版的部分脱离出来,放在一个独立的文件夹中,对于网站的维护
和更改都相当的方便。且可以提高页面的浏览速度,增加客户访问的友好性。在css进行布局时,要有良好的命名习惯,适当的代码注释。
(3)引用js文件,并不是页面的特效越多越好(先css后js)。
(4)对于图片的优化,网站的图片不是越多越好,但要有图片,要完善图片的ALT属性,最好使用带有目标关键词的描述。
(5)对于错误的代码,我们可以利用3w工具进行检查。
对于页面标签的优化,H1定义为正文标题,即一级标题,它具有唯一性。H2为二级标题,主要出现在正文的文章标题上。H3为三级标题,一般出现在页面的侧边栏,H4-H6一般出现较少。值得注意的是在页面中和的区别,对关键字起到强调作用,而仅仅是加粗的作用。
seo代码优化-seo有哪些优化方法-seo怎么优化-做seo优化很简单吗
网站优化就是为了提高企业的知名度,获得更多的点击量,想获得更多的点击不仅仅是从行业最热门的关键词获取,其实一些长尾关键词更显得重要,很多人都不明白长尾关键词的重要性,那么如何去做好这些长尾关键词的排名,去获得更多的点击量呢,旺道优化软件可以解决这些问题。
java的开发环境是什么软件?就是用什么软件编辑代码。调试代码呢?请问jdk是配置出来的?还是下载下来的?
java的运行环境称为Java Runtime Environment, 简称JRE,
如果需要开发Java项目则还需要JDK(开发环境,里面包括相应版本的JRE), 即Java Development Kit。这是Java的环境。
对于你说的用什么软件编辑代码,这个软件称为IDE,Integrated Drive Electronics,即“电子集成驱动器”的意思。就是帮你集成好的开发辅助软件。
所以java的开发只要你有jdk, 那么只要你有一个可以编写文件的软件就可以了,比如文本文档编辑器,也就是我们常说的记事本(TXT),当然,有IDE写起代码来肯定是事半功倍的。
常用的IDE有eclipse, netbeans, JavaBuilder, JCreator, 如果你有学过C/C++那么对Visual Studio应该也是知道的,它也可以(创建J++, J#工程)。
这里我建议你使用eclipse,我认为这是目前市面上对Java编程最实用的IDE。
不过我要提醒你的是,java是有三个分类的,即J2SE, J2ME, J2EE,这三者是不完全相同的(具体什么不同,如果不知道你百度一下很快就知道了,这里就不赘述了),所以开发时要选对相应的eclipse版本,开发J2EE也可以用MyEclispe,只不过这是收费的,要破解下。eclipse的下载链接我放参考资料了,你自己看看吧。
参考资料:www.eclipse.org/downloads/
转载请注明出处51数据库 » 软件工程代码优化 如何优化C++程序代码编写
老实人妙勇