《附录二程式语言效率分析.docx》由会员分享,可在线阅读,更多相关《附录二程式语言效率分析.docx(10页珍藏版)》请在课桌文档上搜索。
1、上一页目录下一页附录二程式语言效率分析附录二程式语言效率分析以下为利用ASSEMBLY,basic,pascal,c,fortran等程式语言,将个24x24之点阵字形,放大成为48x48,并分别比较其处理速度、占用空间以及制作时间。为了正确计算执行时间,特意作10,000次处理,至于指定的24x24字形,则假设为空格。一、ASSEMBLY组合语言变化无穷,先以般的作法,用点阵位移来处理。1PAGE60,1322CGSEGMENT3BUFINDB72DUP(O)45678910:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:29:3
2、0:31:32:33:34:35:36:37:BUFOTSTART:S3:MVBYTE:MVDB:MVDBl:DB72*4DUP(O)ASSUMECS:CG,DS:CG,ES:CGMOVAX,CGMOVDS,AXMOVES,AXCLDMOVBP,10000;处理10,000次SUBCX,CXMOVBX,CXMOVDX,1803H;计数用MOVSI,OFFSETBUFIN;24*24点阵起始位址MOVDI,OFFSETBUFOT;预定48*48储存位址MOVBH,DL:做三列1.ODSB;取原点阵MOVBL,ALMOVCL,8;做八位元RCLBL,1;左移一次PUSHF;保存状态RCLAX,1;
3、两字同时左移一次POPF:取出原移位状态RCLAX,1;再一次,得双位点值1.OOPMVDBl;八次回路STOSW;存入MOVDI+4,X;上下放大一行DECBH;共3列JNZMVDBADDDI,6;移向次行DECDHJNZMVBYTE;共24行38:DECBP;执行10,000次39:JNZS3;完成40:MOVAX,4C00H41:INT21H42:CGENDS43:ENDSTART本程式制作时间,为十五分钟。经汇编后,得934字元的执行程式,执行耗时14.5秒。若将上段程式加以分析,可以发现到此段程式执行时间全部浪费在23至30这一段回路中。为了增加速度,可以将空间加大,避开回路,连续执
4、行八次移位动作如次:23:RCLBL,124:RCLAX,125:SHLAX,126:同上共八次47:MOVCX,AX;AX中为单位元值48:SHRCX,1;CX得到双位元点阵值49:ORAX,CX;双位元点阵合并似此,程式增大了36字元,但执行时间却减少为7.1秒,速度快了一倍!是不是还是更好的方法呢?相信定多得不计其数。比如说,我们已知原点阵放大倍后点形为双点,以双点做表,取其对应之值,即可免除各点移位的手续,再将原程式第18条以下改为:18:VT2:19:CALLMVBYTE;放大一行20:SUBSI,3;纵向尚须放大一次21:CALLMVBYTE;再放大一行22:DECDH;完成否?2
5、3:JNZVT2;再做24:RET;完成25:MVBYTE:26:MOVCL,DL;一行有三字元27:MVDB:28:LODSB;取一字元29:MOVAH,AL;分置两处30:ANDAX,OFFOH;AH,AL各取四位元31:SHRAL,1;右移四次还原32:SHRAL,133:SHRAL,134:SHRAL,135:MOVBL,AL36:MOVAL,BYTETBBX;左字元取预设表值37:MOVBL,AH38:MOVAH,BYTETBBX;右字元取表值39:STOSW;得二字元置缓冲器中40:LOOPMVDB;做三次41:RET42转换表43:BYTETBDB000H,003H,OOCH,O
6、OFH,030H,033H,03CH,03FH44:DBOCOH,0C3H,OCCH,OCFH,OFOH,0F3H,OFCH,OFFH45:CGENDS46:ENDSTART再换个方法,因为有个XALT的指令,是专为这种程式所设计的。由第25条起,调整如下:25:MVBYTE:26:MOVCL,4;供AL左移四位用27:MOVBX,OFFSETBYTETB28:MVDB:29:LODSB;取一字元30:MOVAH,AL;分置两处31:ANDAX,OFOOFH;AH,AL各取四位元32:SHRAL,CL33:XLAT;将BX+AL值放AL中34:XCHGAL,AH35:XLAT36:STOSW3
7、7:DECDL38:JNZMVDB如此,执行程式959字元,执行速度3.2秒,效率更佳。上述程式的缺点为:在循环过程中,速度有所损失,而且用四位元查表也费事耗时。如果用一字元查表,则需增大表的对应值,再改为总表的方式,次即可查到。且由第20行改起,并力求指令的精简,如:20:MOVDX,OFFSETBYTETB21:MVDB:22:LODSB23:SUBAH,AH24:SHLAX,1;一字元须变为二字元25:ADDAX,DX;之位置以查表26:MOVBX,AX;BX可供间接定址用27:MOVAX,BX;以一字元查表值28:STOSW;查妥存入第一行29:MOVDI+4,AX;上下再重复一行30
8、:LODSB31:SUBAH,AH;处32:SHLAX,1;理33:ADDAX,DX34:MOVBX,AX;第35:MOVAX,BX;二36:STOSW;列37:MOVDI+4,AX38:LODSB39:SUBAH,AH;处40:SHLAX,1;理41:ADDAX,DX42:MOVBX,AX;第43:MOVAX,BXJ三44:STOSW;列45:MOVDI+4,AX46:ADDDI,6;再处理下一行47:LOOPMVDB;共24次48:DECBP;做10,000次49:JNZS3;完成50:MOVAX,4C00H51: INT21H52: RET程式到此为止,下面还有转换总表,可供各程式共用。
9、12;转换表;I10111213141516171819202122232425262728293031323334353637383940414243444546BYTETBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBLABELWORD000H,000H,000H,003H,000H,OOCH,000H,OOFH000H,030H,000H,033H,000H,03CH,000H,03FH000H,OCOH,000H,0C3H,000H,OCCH,000H,OCFH00
10、0H,OFOH,000H,0F3H,OOOH,OFCH,OOOH,OFFH003H,OOOH,003H,003H,003H,OOCH,003H,OOI-H003H,030H,003H,033H,003H,03CH,003H,03FH003H,OCOH,003H,0C3H,003H,OCCH,003H,OCFH003H,OFOH,003H,0F3H,003H,OFCH,003H,OFFHOOCH,OOOH,OOCH,003H,OOCH,OOCH,OOCH,OOFHOOCH,030H,OOCH,033H,OOCH,03CH,OOCH,03FHOOCH,OCOH,OOCH,0C3H,OOCH,OCC
11、H,OOCH,OCFHOOCH,OFOH,OOCH,0F3H,OOCH,OFCH,OOCH,OFFHOOFH,OOOH,OOFH,003H,OOFH,OOCH,OOFH,OOFHOOFH,030H,OOFH,033H,OOFH,03CH,OOFH,03FHOOFH,OCOH,OOFH,0C3H,OOFH,OCCH,OOFH,OCFHOOFH,OFOH,OOFH,0F3H,OOFH,OFCH,OOFH,OFFH030H,OOOH,030H,003H,030H,OOCH,030H,OOFH030H,030H,030H,033H,030H,03CH,030H,03FH030H,OCOH,030H,0
12、C3H,030H,OCCH,030H,OCFH030H,OFOH,030H,0F3H,030H,OFCH,030H,OFFH033H,OOOH,033H,003H,033H,OOCH,033H,OOFH033H,030H,033H,033H,033H,03CH,033H,03FH033H,OCOH,033H,0C3H,033H,OCCH,033H,OCFH033H,OFOH,033H,0F3H,033H,OFCH,033H,OFFH03CH,OOOH,03CH,003H,03CH,OOCH,03CH,OOFH03CH,030H,03CH,033H,03CH,03CH,03CH,03FH03CH
13、,OCOH,03CH,0C3H,03CH,OCCH,03CH,OCFH03CH,OFOH,03CH,0F3H,03CH,OFCH,03CH,OFFH03FH,OOOH,03FH,003H,03FH,OOCH,03FH,OOFH03FH,030H,03FH,033H,03FH,03CH,03FH,03FH03FH,OCOH,03FH,0C3H,03FH,OCCH,03FH,OCFH03FH,OFOH,03FH,0F3H,03FH,OFCH,03FH,OFFHOCOH,OOOH,OCOH,003H,OCOH,OOCH,OCOH,OOFHOCOH,030H,OCOH,033H,OCOH,03CH,O
14、COH,03FHOCOH,OCOH,0C3H,OCOH,OCCH,OCOH,OCFH,OCOHOCOH,OFOH,OCOH,0F3H,OCOH,OFCH,OCOH,OFFH0C3H,OOOH,0CH3,003H,0C3H,OOCH,0C3H,OOFH0C3H,030H,0C3H,033H,0C3H,03CH,0C3H,03FH0C3H,OCOH,0C3H,0C3H,0C3H,OCCH,0C3H,OCFH0C3H,OFOH,0C3H,0F3H,0C3H,OFCH,0C3H,OFFHOCCH,OOOH,OCCH,003H,OCCH,OOCH,OCCH,OOFHOCCH,030H,OCCH,033H
15、,OCCH,03CH,OCCH,03FH47:DBOCCH,0C0H,OCCH,0C3H,OCCH,OCCH,OCCH,OCFH48:DBOCCH,0F0H,OCCH,0F3H,OCCH,OFCH,OCCH,OFFH49:DBOCFH,000H,OCFH,003H,OCFH,00CH,OCFH,OOFH50:DBOCEH,030H,OCFH,033H,OCFH,03CH,OCFH,03FH51:DBOCFH,0C0H,OCFH,0C3H,OCFH,OCCH,OCFH,OCFH52:DBOCFH,0F0H,OCFH,0F3H,OCFH,OFCH,OCFH,OFFH53:DB0F0H,000H,0
16、F0H,003H,0F0H,00CH,0F0H,OOFH54:DB0F0H,030H,0F0H,033H,0F0H,03CH,0F0H,03FH55:DB0F0H,0C0H,0F0H,0C3H,0F0H,OCCH,0F0HtOCFH56:DB0F0H,0F0H,0F0H,0F3H,0F0H,OFCH,0F0H,OFFH57:DB0F3H,000H,0F3H,003H,0F3H,00CH,0F3H,OOFH58:DB0F3H,030H,0F3H,033H,0F3H,03CH,0F3H,03FH59:DB0F3H,0C0H,0F3H,0C3H,0F3H,OCCH,0F3H,OCFH60:DB0F3
17、H,OFOH,0F3H,0F3H,0F3H,OFCH,0F3H,OFFH61:DBOFCH,000H,OFCH,003H,OFCH,00CH,OFCH,OOFH62:DBOFCH,030H,OFCH,033H,OFCH,03CH,OFCH,03FH63:DBOFCH,0C0H,OFCH,0C3H,OFCH,OCCH,OFCH,OCFH64:DBOFCH,0F0H,OFCH,0F3H,OFCH,OFCH,OFCH,OFFH65:DBOFFH,000H,OFFH,003H,OFFH,00CH,OFFH,OOFH66:DBOFFH,030H,OFFH,033H,OFFH,03CH,OFFH,03FH
18、67:DBOFFH,0C0H,OFFH,0C3H,OFFH1OCCH,OFFH,OCFH68:DBOFFH,OFOH,OFFH,0F3H,OFFH,OFCH,OFFH,OFFH69:CGENDS70:ENDSTART本程式因为加了个转换表,空间增大为1471字元,但速度却加快为2.5秒,这是空间换时间的最佳例证。C近来极受美国各系统公司的推崇,我们特以之与组合语言作个比较,但不幸的是在指令的精简上,就显得力不从心,不像组合语言那样可以斤斤计较。因此,我们祇能就点阵移位、查小衣及查总表的方式,测试其效率。首先,利用查大衣的方式如下:1mainO2(3unsignedchars243;4unsig
19、nedshorttab256,d483,count;5registershorti,j,k;67for(count=0:count10000;count+)8(9k=0;10:for(i=0;i24;i+)11:12:for(j=0;j3;j+)13:dkj=dk+1j=tabsij;14:k+=2;15:16:17:程式制作时间10分钟,较组合语言稍快;占用空间4575字元,则大了三倍,至于执行速度为18秒,慢了七倍之多。再换个方法,试试查小衣如次:1main()2(3unsignedchari,j,s243,d486,tab16;4unsignedshortcount;5registers
20、hortk,1,x;67for(count=0:count10000;count+)8(9k=0;10:for(i=0;i24;i+)11:12:1=0;13for(j=0:j3;j+)14:(15:X=sij;16:dkl=dk+11=tabx&0360417:dk1+1=dk+11+1=tabx&01718:1+=2:19:)20:k+=2;21:22:)23:占用空间为4,693字元,比组合语言大了五倍;速度为30秒,则慢了四倍多。交换的技术运用下,可以选择最有利的条件。再看利用位置的方式,结果如何?1main()2(3unsignedcharss243;4unsignedshortdd
21、483;5inti,k,count;6registershortd,j;7registerunsignecchars;89for(count=0;count10000;count+)10:(11:k=0;12:1Qfor(i=0;i24;i+)14:for(j-0;j3;j+)15:16:S=ssij;17:d=O;18:if(s&01)19:dI=03;20:if(s&02)21:dI=014;22:if(s&04)这证明了组合语言的灵活性,在空时效率23:dI=060;24:if(s&010)25:dI=0300;26:if(s&020)27:dI=01400:28:if(s&040)29
22、:dI=06000:30:if(s&0100)31:dI=030000;32:if(s&0200)33:dI=0140000:34:35:36:37:38: 39:ddk+1j=ddkj=d;)k+=2;占用的空间为4,727字元,较组合语言大四倍,执行时间29秒,差不多是四倍的差异。这种采用高阶指令的方式,拉近了C与组合语言的距离。足证纵然使用组合语言,若不采用精简指令的技巧,其效率不彰。般程式师很少在组合语言的技巧上下功夫,以致不能认识组合语言的真面目。三、BASIC10:DIMwd24(23,2),WD48(47,5),table(255),mask(7)20:rl=030:r2=040
23、:REM用测试点的方式,每字元分八次处理。50:mask(0)=060:mask(1)=270:FORi=2TO780:mask(i)=mask(i-l)*290:NEXTi100:INPUTA$110:FORcount=1TO10120:K=OFORi=0TO23140:T=O150:FORj=0TO2160:FORm=0TO7170:temp=table(wd24(i,j)180:temp=tempANDmask(m)190:IFtemp=128THENrl=192ANDrl200:IFtemp=64THENrl=48ANDrl210:IFtemp=32THENrl=12ANDrl220:
24、IFtemp=16THENrl=3ANDrl230:IFtemp=8THENr2=192ANDr2240:IFtemp=128THENr2=48ANDr2250:IFtemp=64THENr2=12ANDr2260:IFtemp=32THENr2=3ANDr2270:NEXTm280:wd48(K,T)=rl290:wd48(K,T+l)=r2300:wd48(K+l,T)=rl310:wd48(K+l,T+l)=r2320:T=T+2330:NEXTj340:K=K+2350:NEXTi360:NEXTcount370:PRINT“FINISHED380:END本程式制作时间为10分钟,执行
25、程式共占12,764字元,执行时间为23,000秒!足证BASlC不适用于点阵处理,由于上述的处理方法是以移位为主,因BASIC没有专用的指令,所以非常不利。现在改用查表方法,再看如何。10:REM本程式将24*24的点阵以查表方式转为48*4820:rem本程式用quickbasicversion4.00microsoftinc.30:dimwd24(23,2),wd48(47,2).table(255)40:FORK=ITO10050:T=O60:FOR1=0TO2370:FORJ=OTO280:A=TABLE(WD24(I,J)90:WD48(T,J)=A100:WD48(T+1,J)=
26、A110:NEXTJ120:NEXTI130:NEXTK140:END本程式所用对照表与一、同,执行程式占11,642字元,执行时间共计1,800秒。其他的改进方法当然还有,可是看来已接近极限。四、PASCALPASCAL仅适用于查总表的方式,在我们没有发展出!制衣法以前,几乎要放弃这个试验。现在,且沿用组合语言所用的总衣,看其效率如何吧!1:PROGRAMPASTABLE;2VAR3SOURCE:PACKEDARRAY1-24,1-3OF-1281274OBJCT:ARRAYl-48,13OFINTEGER;5TABLE:ARRAY0255OFINTEGER;6I,J,K,N:INTEGER
27、:7BEGIN8FORN:=lTO10000DO9BEGIN10:K:=0;11:12:13:14:15:16:17:18:19:20: END21: end.FOR1:=1TO24DOBEGINFORJ:=lTO3DOBEGINOBJCTK,J=TABLESOURCEI,J;OBJCTK+1,J=OBJCTK,JEND;K:=K+2END本程式制作需时10分钟,空间占U,650字元,执行时间为17秒,较BASlC为佳。显然PASCAL的效率较C及组合语言为差,但若不计总表,程式仅21条,差强人意。五、FORTRAN同样的,FORTRAN也祇能用查表的方法,程式如下:1: DIMENSIONI
28、Tl(24,3(,1T2(48,6),IT3(256)2: DO4011=1,100003: DO301=1,244: M=I+I5: DO30J=I,36: K=IT3(IT1(I,J)7: IT2(M-1,J)=K8: 30IT2(M,J)=K9: 40CONTINUE10: END这段程式也是用查表的方式,制作时间7分钟,执行程式9,959字元,比C稍大,执行速度也较慢,为20秒。另外,在FoRTRAN中也没有找到适合的位元控制指令,因此很难再加改进。从上述的试验中,可以看出这几种语言的效率差异。不论用什么方法,组合语言明显地遥遥领先。就制作时间而言,因为程式简单,看不出很大分别。事实上
29、,组合语言的确比较复杂,祇是我们习惯成自然,有了经验,所以制作时显得轻松。以下为上述测试的统计表:IlllI处理方式I程式语言I制作时间IIIIIIII程式空间I(分钟)III执行速度I(字元)III备I(秒)I注IIIlllI点阵位移I组合语言I15IIIII970II7.1IIICI10I4,727I29.0IIIbasic?IIIII10II12,764II23,000.0IIIlllI查小表法I组合语言I15IIIII949II3.2I边际效益最高IIICI10I4,693III30.0IIIlllI查总表法I组合语言I15III1,441II2.5I速度效益最高ICIIII10IpascalIfortrcnIIII?74,57510II18.0II11,650I9,959I17.020.0IIbasicIII10IIII11,692II1,800.0II上一页目录F一页