SSブログ
English Version

レトロマイコン86ボードの構想(その18)asciiartの高速化 [8086]

 V20(8088互換)を使った自作ボードで動作しているCP/M-86上でMBASICを使ってasciiartを動かしてみると3分18秒2分43秒(V20は8MHzで動作)で、Z-80でのASCIIARTの実行速度と比べてそれほど速いという感じはありませんでした(FPUを付ければ速くなるのだろうけど)

★2019/12/21 asciiart実行時間を修正(3分18秒はCP/M-80エミュでの時間でした^^;)

 コンパイルすることである程度は高速化できるでしょうがどれだけ高速になるかはコンパイラに依存する部分が多々あります。
 近年のコンパイラではコンパイル時の最適化として定数畳み込みループ展開等の手法により、例えば最適化の結果、1~10の総和を求めるループ処理自体が単なる定数値になってしまうケースもあります。

 それならば・・・と言うことでハンド最適化してみました(うそ)。
 まず、asciiartの元ソースは下記でマンデルブロ集合での発散までの回数により表示コードを決定しています。

asciiart BASIC ソース
10 FOR Y=-12 TO 12
20 FOR X=-39 TO 39
30 CA=X*.0458
40 CB= Y*.08333
50 A=CA
60 B=CB
70 FOR I=0 TO 15
80 T=A*A-B*B+CA
90 B=2*A*B+CB
100 A=T
110 IF (A*A+B*B)>4 THEN GOTO 200
120 NEXT I
130 PRINT " ";
140 GOTO 210
200 IF I>9 THEN I=I+7
205 PRINT CHR$(48+I);
210 NEXT X
220 PRINT
230 NEXT Y


 定数畳み込みとループ展開を手動で適用した結果、事前に計算できる結果を埋め込むことでV20の8MHz動作でasciiartの実行時間が33秒になりましたww

 Twitterにポストした動画を貼っておきます。



 種明かしは・・・

asciiart ニセ高速化BASIC ソース
10 DIM D$(20)
20 IDX=-1
30  IDX=IDX+1
40  READ D$(IDX)
50  IF D$(IDX)<>"" THEN 30
60 IDX=IDX-1
70 ST=0:EN=IDX:STP=1:GOSUB 500
80 ST=IDX-1:EN=0:STP=-1:GOSUB 500
90 END
500 FOR I=ST TO EN STEP STP
510  DSP$=D$(I):GOSUB 600
520 NEXT I
530 RETURN
600 L=LEN(DSP$)
610 FOR J=1 TO L
620  FOR T=0 TO ((L/2-ABS(J-L/2))/20)^5:NEXT T
630  PRINT MID$(DSP$,J,1);
640 NEXT J
650 PRINT
660 RETURN
1000 DATA "000000011111111111111111122222233347E7AB322222111100000000000000000000000000000"
1010 DATA "000001111111111111111122222222333557BF75433222211111000000000000000000000000000"
1020 DATA "000111111111111111112222222233445C      643332222111110000000000000000000000000"
1030 DATA "011111111111111111222222233444556C      654433332211111100000000000000000000000"
1040 DATA "11111111111111112222233346 D978 BCF    DF9 6556F4221111110000000000000000000000"
1050 DATA "111111111111122223333334469                 D   6322111111000000000000000000000"
1060 DATA "1111111111222333333334457DB                    85332111111100000000000000000000"
1070 DATA "11111122234B744444455556A                      96532211111110000000000000000000"
1080 DATA "122222233347BAA7AB776679                         A32211111110000000000000000000"
1090 DATA "2222233334567        9A                         A532221111111000000000000000000"
1100 DATA "222333346679                                    9432221111111000000000000000000"
1110 DATA "234445568  F                                   B5432221111111000000000000000000"
1120 DATA "                                              864332221111111000000000000000000"
1130 DATA ""



★追記 2023/01/24
 「GAME言語での ASCIIART の高速化」の記事にアセンブラで書いた固定小数点を使い、asciiartを実際に高速化した内容を書きました。


[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー