独自言語 picle のコンパイラ化(その5) [PIC]
picle言語 のPIC24FJ用セルフコンパイラ製作の続編です。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
- インタープリタとの速度比較
picleコンパイラがほぼ動く状態になりました。ディバッグ用に表示していたコンパイル時のアセンブリ言語のニーモニック表示をオフにして実行させるとコンパイル時間は殆ど気にならない程度でした。
picle言語の大規模なソースはまだ無いので「 PIC24FJ64GAでGAME言語(その4) 」に追記した picle言語版ライフゲームのソースでの体感速度です。
最初はrun後に少し待ち時間がありましたがInit()の処理前に "start"と表示するようにしたところ run 後すぐに"start"が表示されました。
元々フラッシュメモリへの書込みのアセンブル言語処理をある程度まとまったブロック単位の書込みにして高速化しようと思っていましたが、この作業のプライオリティを一旦低くします。
気になる実行速度についてですが、インタープリタとの簡単な比較をしてみます。コンパイラを作成する過程でインタープリタ側の速度改善箇所も見つかりましたがコンパイラが最終目的なので反映していません ^^;
適当なベンチマークプログラムが無かったので「PIC24FJ64GAでGAME言語 ^^ 」で紹介した素数を求めるプログラム(配列を使わない低速なアルゴリズムのもの)をアレンジして使いました。
シリアル通信の影響をなくし純粋に処理速度比較するために処理途中の表示をコメントアウトしています。
1200以下の素数を求める処理時間比較は下記のようにコンパイラが76倍の実行速度という結果でした ^^
インタープリタ版ではソースをインタープリットしながら実行するという原理的な速度低下は当然ありますが、変数アクセスの度に変数サーチするのと proc/func コールの都度、処理名サーチ及びローカル変数の領域確保することが処理速度低下の1要因だと思います。
尚、処理時間は picle に実装している 10ms 毎に割込み処理でデクリメントされる Timer_ 変数を使って計測しました。
インタープリタ コンパイラ 速度比 28880[ms]
380[ms]
76倍
- 素数プログラムのコンパイル結果
コンパイル結果を下記に示します。従来からの変更点としては
- 変数専用スタックの廃止
前回の「独自言語 picle のコンパイラ化(その4)」のコンパイルサンプルでは W13 レジスタを使って一時的な変数専用のスタックを実現していましたが W15(スタックレジスタ)のスタックに統合しました。
- exit()用エントリ
前回記事でexit()用エントリのために W15 レジスタを保存していましたが、これだけでは不十分で W14 レジスタも保存する必要があったので追加しました。 - Input_()処理
インタープリタ版では入力文字列を数式評価処理し、計算式の入力を可能にしていましたが、今回のコンパイラ版では直値入力のみにしました。
素数プログラムのコンパイル例 :l 1:# sosuu 2: 3:var Cnt; 4: 5:proc ans(n) { 6: Cnt = Cnt + 1; 7:# PrnStr_("¥nNo"); 8:# PrnDecF_(Cnt,3); 9:# PrnChar_(':'); 10:# PrnDecF_(n,4); 11:} 12: 13: 14:proc main() { 15: var i,j,max; 16: PrnStr_("¥ninput Max:"); 17: max=Input_(); 18: Timer_ = 32000; 19: Cnt=0; 20: if (max>1) { 21: ans(2); 22: } 23: for (i=3;i<=max;i=i+2) { 24: for (j=2;j<i;j=j+1) { 25: if (i%j=0) { 26: j=i+1; 27: } 28: } 29: if (j=i) { 30: ans(i); 31: } 32: } 33: PrnStr_("¥nAnswer is "); 34: PrnDec_(Cnt); 35: PrnStr_( "¥ntime[ms] : " ); 36: PrnDec_( (32000 - Timer_) * 10 ); 37:} 38: :run 8000 : MOV W15,[e5ah] 8002 : MOV W14,[e5ch] 8004 : BRA 801eh 8006 : MOV [e5ch],W14 8008 : MOV [e5ah],W15 800a : RETURN 800c : LNK #2 800e : MOV W0,[W14+0h] 8010 : MOV [bd4h],W0 8012 : MOV W0,[W15++] 8014 : MOV #1h,W0 8016 : ADD W0,[--W15],W0 8018 : MOV W0,[bd4h] 801a : ULNK 801c : RETURN 801e : LNK #6 8020 : MOV #18a3h,W0 8022 : RCALL 162eh 8024 : RCALL 17e8h 8026 : MOV W0,[W14+4h] 8028 : MOV #7d00h,W0 802a : MOV W0,[bd2h] 802c : MOV #0h,W0 802e : MOV W0,[bd4h] 8030 : MOV [W14+4h],W0 8032 : MOV W0,[W15++] 8034 : MOV #1h,W0 8036 : CP W0,[--W15] 8038 : CLR W0 803a : BRA GE,803eh 803c : INC W0,W0 803e : CP0 W0 8040 : BRA Z,8046h 8042 : MOV #2h,W0 8044 : RCALL 800ch 8046 : MOV #3h,W0 8048 : MOV W0,[W14+0h] 804a : MOV [W14+0h],W0 804c : MOV W0,[W15++] 804e : MOV [W14+4h],W0 8050 : CP W0,[--W15] 8052 : CLR W0 8054 : BRA LT,8058h 8056 : INC W0,W0 8058 : CP0 W0 805a : BRA Z,80d2h 805c : MOV #2h,W0 805e : MOV W0,[W14+2h] 8060 : MOV [W14+2h],W0 8062 : MOV W0,[W15++] 8064 : MOV [W14+0h],W0 8066 : CP W0,[--W15] 8068 : CLR W0 806a : BRA LE,806eh 806c : INC W0,W0 806e : CP0 W0 8070 : BRA Z,80b0h 8072 : MOV [W14+0h],W0 8074 : MOV W0,[W15++] 8076 : MOV [W14+2h],W0 8078 : MOV [--W15],W2 807a : CP0 W0 807c : BTSC [42h],#1 807e : RCALL 1850h 8080 : MOV W0,W3 8082 : REPEAT 17 8084 : DIV.S W2,W3 8086 : MOV W1,[bd0h] 8088 : MOV W1,W0 808a : MOV W0,[W15++] 808c : MOV #0h,W0 808e : CP W0,[--W15] 8090 : CLR W0 8092 : BTSC [42h],#1 8094 : INC W0,W0 8096 : CP0 W0 8098 : BRA Z,80a4h 809a : MOV [W14+0h],W0 809c : MOV W0,[W15++] 809e : MOV #1h,W0 80a0 : ADD W0,[--W15],W0 80a2 : MOV W0,[W14+2h] 80a4 : MOV [W14+2h],W0 80a6 : MOV W0,[W15++] 80a8 : MOV #1h,W0 80aa : ADD W0,[--W15],W0 80ac : MOV W0,[W14+2h] 80ae : BRA 8060h 80b0 : MOV [W14+2h],W0 80b2 : MOV W0,[W15++] 80b4 : MOV [W14+0h],W0 80b6 : CP W0,[--W15] 80b8 : CLR W0 80ba : BTSC [42h],#1 80bc : INC W0,W0 80be : CP0 W0 80c0 : BRA Z,80c6h 80c2 : MOV [W14+0h],W0 80c4 : RCALL 800ch 80c6 : MOV [W14+0h],W0 80c8 : MOV W0,[W15++] 80ca : MOV #2h,W0 80cc : ADD W0,[--W15],W0 80ce : MOV W0,[W14+0h] 80d0 : BRA 804ah 80d2 : MOV #1975h,W0 80d4 : RCALL 162eh 80d6 : MOV [bd4h],W0 80d8 : RCALL 17dah 80da : MOV #199fh,W0 80dc : RCALL 162eh 80de : MOV #7d00h,W0 80e0 : MOV W0,[W15++] 80e2 : MOV [bd2h],W0 80e4 : MOV [--W15],W2 80e6 : SUB W2,W0,W0 80e8 : MOV W0,[W15++] 80ea : MOV #ah,W0 80ec : MOV [--W15],W2 80ee : MUL.SS W2,W0,W0 80f0 : RCALL 17dah 80f2 : ULNK 80f4 : RETURN input Max:1200 Answer is 196 time[ms] : 380 :
- 変数専用スタックの廃止
[TOP] [ 前へ ] 連載記事 [ 次へ ]
コメント 0