📄 附录二 程式语言效率分析.htm
字号:
<BR><BR>三、BASIC
<BR><BR> 10: DIM wd24(23,2),WD48(47,5),table(255),mask(7)
<BR> 20: r1=0 <BR> 30: r2=0
<BR> 40: REM 用测试点的方式,每字元分八次处理。
<BR> 50: mask(0)=0 <BR> 60: mask(1)=2
<BR> 70: FOR i=2 TO 7
<BR> 80: mask(i)=mask(i-1)*2
<BR> 90: NEXT i <BR>100: INPUT A$
<BR>110: FOR count=1 TO 10
<BR>120: K=0 <BR>130: FOR i=O TO 23
<BR>140: T=0 <BR>150: FOR j=0 TO 2
<BR>160: FOR m=0 TO 7
<BR>170: temp=table(wd24(i,j))
<BR>180: temp=temp AND mask(m)
<BR>190: IF temp=128 THEN r1=192 AND r1
<BR>200: IF temp=64 THEN r1=48 AND r1
<BR>210: IF temp=32 THEN r1=12 AND r1
<BR>220: IF temp=16 THEN r1=3 AND r1
<BR>230: IF temp=8 THEN r2=192 AND r2
<BR>240: IF temp=128 THEN r2=48 AND r2
<BR>250: IF temp=64 THEN r2=12 AND r2
<BR>260: IF temp=32 THEN r2=3 AND r2
<BR>270: NEXT m <BR>280: wd48(K,T)=r1
<BR>290: wd48(K,T+1)=r2 <BR>300: wd48(K+1,T)=r1
<BR>310: wd48(K+1,T+1)=r2 <BR>320: T=T+2
<BR>330: NEXT j <BR>340: K=K+2
<BR>350: NEXT i <BR>360: NEXT count
<BR>370: PRINT "FINISHED" <BR>380: END
<BR><BR> 本程式制作时间为10分钟,执行程式共占12,764字元,执行时间为23,000秒!
<BR> 足证BASIC 不适用于点阵处理,由于上述的处理方法是以移位为主,因BASIC 没有专用的指令,所以非常不利。现在改用查表方法,再看如何。
<BR><BR> 10: REM 本程式将24*24的点阵以查表方式转为48*48
<BR> 20: rem 本程式用quickbasic version 4.00 microsoft inc.
<BR> 30: dim wd24(23,2),wd48(47,2).table(255)
<BR> 40: FOR K=1 TO 100
<BR> 50: T=0
<BR> 60: FOR I=0 TO 23
<BR> 70: FOR J=0 TO 2
<BR> 80: A=TABLE(WD24(I,J))
<BR> 90: WD48(T,J)=A
<BR>100: WD48(T+1,J)=A
<BR>110: NEXT J
<BR>120: NEXT I
<BR>130: NEXT K
<BR>140: END
<BR><BR> 本程式所用对照表与一、同,执行程式占11,642字元,执行时间共计1,800 秒。
<BR> 其他的改进方法当然还有,可是看来已接近极限。
<BR><BR>四、PASCAL
<BR><BR> PASCAL仅适用于查总表的方式,在我们没有发展出「制表法」以前,几乎要放弃这个试验。现在,且沿用组合语言所用的总表,看其效率如何吧!
<BR><BR> 1: PROGRAM PASTABLE;
<BR> 2: VAR
<BR> 3: SOURCE :PACKED ARRAY[1…24,1…3] OF -128…127;
<BR> 4: OBJCT :ARRAY[1…48,1…3] OF INTEGER;
<BR> 5: TABLE :ARRAY[0…255] OF INTEGER;
<BR> 6: I,J,K,N:INTEGER;
<BR> 7: BEGIN
<BR> 8: FOR N:=1 TO 10000 DO
<BR> 9: BEGIN
<BR> 10: K:=O;
<BR> 11: FOR I:=1 TO 24 DO
<BR> 12: BEGIN
<BR> 13: FOR J:=1 TO 3 DO
<BR> 14: BEGIN
<BR> 15: OBJCT[K,J]=TABLE[SOURCE[I,J];
<BR> 16: OBJCT[K+1,J]=OBJCT[K,J]
<BR> 17: END;
<BR> 18: K:=K+2
<BR> 19: END
<BR> 20: END
<BR> 21: end.
<BR><BR> 本程式制作需时10分钟,空间占11,650字元,执行时间为17秒,较BASIC 为佳。
<BR> 显然 PASCAL 的效率较C及组合语言为差,但若不计总表,程式仅21条,差强人意。
<BR><BR>五、FORTRAN
<BR><BR> 同样的,FORTRAN 也祇能用查表的方法,程式如下:
<BR><BR> 1: DIMENSION IT1(24,3(,IT2(48,6),IT3(256)
<BR> 2: DO 40 II=1,10000
<BR> 3: DO 30 I=1,24
<BR> 4: M=I+I
<BR> 5: DO 30 J=1,3
<BR> 6: K=IT3(IT1(I,J))
<BR> 7: IT2(M-1,J)=K
<BR> 8: 30 IT2(M,J)=K
<BR> 9: 40 CONTINUE
<BR> 10: END
<BR> 这段程式也是用查表的方式,制作时间7分钟,执行程式 9,959字元,比C稍大,执行速度也较慢,为20秒。另外,在 FORTRAN中也没有找到适合的位元控制指令,因此很难再加改进。
<BR> 从上述的试验中,可以看出这几种语言的效率差异。不论用什么方法,组合语言明显地遥遥领先。
<BR> 就制作时间而言,因为程式简单,看不出很大分别。事实上,组合语言的确比较复杂,祇是我们习惯成自然,有了经验,所以制作时显得轻松。
<BR> 以下为上述测试的统计表:
<BR> ┌────┬────┬────┬──────┬─────┬──────┐
<BR> │处理方式│程式语言│制作时间│ 程式空间 │执行速度 │ 备 注 │
<BR> │ │ │(分钟)│ (字元) │ (秒) │ │
<BR> ├────┼────┼────┼──────┼─────┼──────┤
<BR> │点阵位移│组合语言│ 15 │ 970 │ 7.1 │ │
<BR> │ │c │ 10 │ 4,727 │ 29.0 │ │
<BR> │ │basic?│ 10 │ 12,764 │ 23,000.0 │ │
<BR> ├────┼────┼────┼──────┼─────┼──────┤
<BR> │查小表法│组合语言│ 15 │ 949 │ 3.2 │边际效益最高│
<BR> │ │c │ 10 │ 4,693 │ 30.0 │ │
<BR> ├────┼────┼────┼──────┼─────┼──────┤
<BR> │查总表法│组合语言│ 15 │ 1,441 │ 2.5 │速度效益最高│
<BR> │ │c │ 10 │ 4,575 │ 18.0 │ │
<BR> │ │pascal │ 10 │ 11,650 │ 17.0 │ │
<BR> │ │fortrcn │?7 │ 9,959 │ 20.0 │ │
<BR> │ │basic │ 10 │ 11,692 │ 1,800.0 │ │
<BR> └────┴────┴────┴──────┴─────┴──────┘
<BR><BR></FONT></P></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%" bgColor=#f2f2f2 height=20>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%">
<P class=9 align=right><FONT face=细明体><A
href="http://www.wisesoul.net/web/asm/asm/asm06.htm">上一页</A>
<A
href="http://www.wisesoul.net/web/asm/asm/index.html">目录</A>
<A
href="http://www.wisesoul.net/web/asm/asm/asm08.htm">下一页</A>
</FONT></P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></CENTER></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -