‘壹’ 为什么说汇编语言的执行效率高
呵呵,你这个问题倒是很有意思。
首先什么是执行效率。我们平常所说的执行效率就是使用相同的算法在相同输入条件下完成相同计算所产生的系统开销,目前来说一般会更多关注执行时间方面的开销。
你说的是没错,所有语言编写的代码最终要运行,都要转化成机器码。但是,由于这个“转化”所采用的方法不同,其所需要消耗的时间也使不同的。
具个简单的例子来说,比如把一个变量的值自加1,并执行100次,也就是下面这条语句:
for(i=0;i<100;)
{
i++;
}
那么对于一个没有充分优化的c语言编译器而言,你需要每次寻址内存找到变量,然后把变量值拷贝到寄存器,然后对寄存器自加1,然后把寄存器值写回到内存,整个过程需要反复执行100次。
但是如果你写汇编代码,那就没这么麻烦了,你只需要寻址内存一次,把变量读入寄存器,然后对寄存器自加100次,最后写回内存即可。你可以想见,这个汇编代码的执行速度要比C语言快得多,但它们所执行的功能是一样的。
当然,我前面这个例子只是用来说明问题,并不具有实践价值。实践中有很多因素影响程序的效率,例如编译方式、优化程度等等。而这些与程序员的素质也有关系,一个差的汇编程序很可能不如一个好的C语言程序执行效率高。
‘贰’ 对DSP而言,CCS用C语言编程和汇编编程,二者的效率相差多少
我用的是28XX系列的,不知道经验对你有没有用,因为不同系列的芯片多少有些差别。
TI提供的库已经相当可以了,兼顾易用与效率。我当时做过这样的测试
1. 用IQMATH实现
2. 直接C语言实现
3. C语言优化实现
4. 原生汇编实现
IQMATH的运行周期在1000左右,比方案3快几十个周期,比方案4慢几个周期,方案2是10000多个周期。
另外,因为只是单独测的算法,汇编之所以快是快在寄存器的使用上,操作数可以直接入寄存器,但是考虑到程序其他部分是用C语言编写的话,把操作栈的时间也加上,并不比方案1快。毕竟我对TI的汇编吃的也不透。
在编写上,无疑是方案1提供了最接近C语言风格的实现,几乎不用考虑ISA方面的问题。
另外对于执行效率,我觉得主要考虑三点:
1.分支的使用
CCS对C语言的优化我没做过太多比对。其实单从反汇编的结果看,我接触过的嵌入式开发环境的编译器都能做出很好的优化。但是几乎每个编译器都会在逻辑的优化上有欠缺——它只能对一些显而易见的判断条件进行优化,而在写程序的过程中,我们经常出于易读性的考虑,或者稳定性的考虑,或者其他的考虑加入几乎不会发生的分支,这样的分支判断会消耗一定比率的代码段执行效率,视乎代码段内有用功能的长度而定,越长这个比率越小,越短这个比率越高。
2.一般操作,就是各种赋值操作
在一般的操作上,编译器的优化已经很令人满意了,基本上可以作为编写汇编的范本。我觉得所谓效率能达到90%就是针对这个部分说的。
3.特殊操作,比如对整块内存的操作,或者是浮点运算上。
在一些特殊的操作上,就要看是否有现成的库,或者看硬件是否支持。比如对整块内存操作就别用循环一个字节一个字节的搬了。
以上三点都能考虑到的话,相信执行效率方面已经没有太大的提升空间了。
另外如果你的代码发生在初始化部分,也就是只在系统运行开始的时候运行一次,那么优化不优化其实没有太大的必要,除非你对系统初始化的时间有严格的要求。但是如果你的代码是作为任务要被反复运行的,那就有优化的必要了。
在CCS里有代码消耗时钟周期的统计,如果你觉得某段代码效率低下的话,可以先分段进行消耗时钟周期的计算,这样优化比较有针对性。
‘叁’ c语言和汇编混编,效率如何
就是常说的混合编程呗,除了纯汇编以外效率最高的方式.
优点在于汇编可以弥补C语言的一些瓶颈,从而提高效率,如C中的循环就是反复赋值的过程,这是一个瓶颈无法解决,但是这地方若要用汇编代码弥补,就大大提高了效率.
缺点在于不宜编写,本来编写C就需要很小心,还要在准确的加入汇编,对各个寄存器的现场保护与恢复很费脑筋.
一般来说,最好的C程序员都是由写汇编出身转成C的人.汇编是从基本上了解编程思想.如果你时间充裕,强烈建议从汇编入手.
‘肆’ 关于汇编和c语言效率哪个高
当然是汇编语言效率高:
高级语言一般都是被编译程序编译成 汇编代码,然后再转换成机器码.
汇编语言直接被编译成机器码.
如果楼主学了汇编语言就知道了,汇编语言更靠近硬件,是做病毒的好东西!
‘伍’ c语言效率问题
汇编语言的效率确实比C语言高,但汇编语言调试过程较为困难,代码容易遗留缺陷,而且难以维护。其实编译器已经把你这个想法干掉了,C编译器会把C代码转换成汇编代码,再翻译成机器指令。如果想获得较高的效率,可在编译前,将编译器的优化选项打开,如此即可获得较高效率的代码。如果这样得到的代码还是不能满足要求,那么合适的做法是识别程序中对效率要求最高的一小部分,将这小部分代码用汇编实现,并将代码嵌入到C程序中。
‘陆’ 几种C语言优化代码技巧
以下内容摘自李亚锋先生的《经典C面试真题精讲》
1.结构体设计为成员最长类型长度的整数倍;
2.减少函数参数的个数,不需要返回值的函数定义为void类型;
3.if...else....多条件分支语句中,把出现频率高的条件放在前面;
4.同时声明多个相同类型变量优于分别单独声明变量;
5.减少定义全局变量;
6.使用#define定义常量和小的函数实现;
7.有些情况嵌套汇编语句效率更高;
8.占用大的存储空间可以减少执行时间,同理时间也可以换取空间;
9提高程序算法效率;
‘柒’ win32汇编与C语言哪个效率高
当然是汇编语言效率高。
常说汇编语言过时,是低级语言,并不是说汇编语言要被弃之,相反,汇编语言仍然是程序员必须了解的语言,在某些行业与领域,汇编是必不可少的,非它不可适用。只是,现在计算机最大的领域为IT软件,也是我们常说的 Windows 编程,在熟练的程序员手里,使用汇编语言编写的程序,运行效率与性能比其它语言写的程序是成倍的优秀,但是代价是需要更长的时间来优化,如果对计算机原理及编程基础不扎实,实在是得不偿失,对比现在的软件开发,已经是市场化的软件行业,加上高级语言的优秀与跨平台,一个公司不可以让一个团队使用汇编语言来编写所有的东西,花上几倍甚至几十倍的时间,不如使用其它语言来完成,只要最终结果不比汇编语言编写的差太多,就能抢先一步完成,这是市场经济下的必然结果。
一个电子工程师,主要开发语言就是汇编,c语言使用只占极少部分,而电子开发工程师是千金难求,在一些工业公司,一个核心的电子工程师比其它任何职员待遇都高,对比起来,一般电子工程师待遇是程序员的十倍以上。这种情况是因为现在学习汇编的人虽然也不少,但是真正能学到精通的却不多,它难学,难用,适用范围小,虽然简单,但是过于灵活,学习过高级语言的人去学习汇编比一开始学汇编的人难得多,但是学过汇编的人学习高级语言却很容易,简从繁易,繁从简难。
‘捌’ 一个关于C语言语句用汇编优化的问题:
生成的汇编已经够精简了,看起来你是在一个双重循环中使用了这句
内联汇编应该解决不了这里的效率问题,可以尝试修改你这段代码,比如,内层的循环,那个指针没必要重复计算和加载
double temp1,temp2;
for(int j=0; j < MMM; j++)
{
double *dbp = hpdf->b[j]->var->vec;
for(int i=0;i <NNN;i++)
temp2+=temp1*temp1*dbp[i];
}
又比如,temp1的平方如果是在外层就可以计算的,也没必要在内层循环计算
这只是个修改的思路,你再看编译出来的代码情况