レトロマイコン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の元ソースは下記でマンデルブロ集合での発散までの回数により表示コードを決定しています。
定数畳み込みとループ展開を手動で適用した結果、事前に計算できる結果を埋め込むことでV20の8MHz動作でasciiartの実行時間が33秒になりましたww
Twitterにポストした動画を貼っておきます。
種明かしは・・・
★追記 2023/01/24
「GAME言語での ASCIIART の高速化」の記事にアセンブラで書いた固定小数点を使い、asciiartを実際に高速化した内容を書きました。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
★2019/12/21 asciiart実行時間を修正(3分18秒はCP/M-80エミュでの時間でした^^;)
コンパイルすることである程度は高速化できるでしょうがどれだけ高速になるかはコンパイラに依存する部分が多々あります。
近年のコンパイラではコンパイル時の最適化として定数畳み込みやループ展開等の手法により、例えば最適化の結果、1~10の総和を求めるループ処理自体が単なる定数値になってしまうケースもあります。
それならば・・・と言うことでハンド最適化してみました(うそ)。
まず、asciiartの元ソースは下記でマンデルブロ集合での発散までの回数により表示コードを決定しています。
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にポストした動画を貼っておきます。
V20(8088互換)を使った自作ボードでCP/M-86でMBASICでasciiartを動かしてみると3分18秒(V20は8MHz)でそれほど速いという感覚はありませでした。
— skyriver (@wcinp) December 20, 2019
ハンド最適化によりasciiartの実行時間が33秒になったよw(うそ)#ASCIIART #MBASIC #CPM86 #Pic24V20 #i8088https://t.co/FxIPabtDRw pic.twitter.com/yRV1VRSBz9
種明かしは・・・
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] [ 前へ ] 連載記事 [ 次へ ]
コメント 0