独自言語 picle のコンパイラ化(その9) [PIC]
picle コンパイラができてきたのでマイクロチップ社の xc16 コンパイラとの速度比較を行ってみました。
ベンチマークプログラムとして「独自言語 picle のコンパイラ化(その5)」で picleインタープリタとコンパイラの速度比較で使用した素数を求めるプログラムを使い、5000 以下の素数を求める時間を比較してみました。
結果から言うと下表のように picle の処理時間と xc16 の最適化レベル毎の処理時間比は 約1.6倍(最適化レベル:0)、約2.1倍(最適化レベル:1)でした。
処理時間は picle に実装している 10ms 毎にディクリメントされる Timer_ 変数を用いて測定しました。
picle側は局所的な最適化しかしていないのでまぁこんなものだと思います。でもコンパイル+フラッシュ書込みの時間は xc16 より二桁倍以上速い(^^)
picle側が遅い主な要因は下記内容であると考えられます(いずれも最適化検討段階で気づいていたことではありますが・・)
素数プログラム(xc16)
素数プログラム(picle)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
ベンチマークプログラムとして「独自言語 picle のコンパイラ化(その5)」で picleインタープリタとコンパイラの速度比較で使用した素数を求めるプログラムを使い、5000 以下の素数を求める時間を比較してみました。
結果から言うと下表のように picle の処理時間と xc16 の最適化レベル毎の処理時間比は 約1.6倍(最適化レベル:0)、約2.1倍(最適化レベル:1)でした。
処理時間は picle に実装している 10ms 毎にディクリメントされる Timer_ 変数を用いて測定しました。
xc16 | picle | rate | |
---|---|---|---|
optimize:0 | 3240 ms | 5280 ms | 1.63 |
optimize:1 | 2550 ms | 5280 ms | 2.07 |
picle側は局所的な最適化しかしていないのでまぁこんなものだと思います。でもコンパイル+フラッシュ書込みの時間は xc16 より二桁倍以上速い(^^)
picle側が遅い主な要因は下記内容であると考えられます(いずれも最適化検討段階で気づいていたことではありますが・・)
- 比較演算子の処理
picleは比較演算子の演算結果として論理値(0/1)まで計算してから分岐判断しているが、xc16 は両辺の差分計算後、ステータスのフラグ状態により分岐している。
- インクリメント演算子
xc16 はインクリメントでは inc命令、プラス2では inc2命令を使っているが picle はそもそもインクリメント演算子に対応しておらず、他の足し算と同様に計算している。
- for文の展開
picleではループ内に 条件ジャンプと無条件ジャンプの二つのジャンプ命令が使われるが、xc16 では条件ジャンプのみ使っている。
#include <xc.h> int Cnt; void ans( int n ); int __attribute__ ((address(0x9030))) prime( int max ) { int i,j; Cnt = 0; if( max > 1 ) { ans( 2 ); } for( i = 3 ; i <= max ; i += 2 ) { for( j = 2 ; j < i ; j++ ) { if( i % j == 0 ) { j = i + 1; } } if( j == i ) { ans( i ); } } return( Cnt ); } void ans( int n ) { Cnt++; } int main() { prime( 0 ); return( 0 ); } |
:l 1:# sosuu 2: 3: 4:var Cnt; 5: 6:func prime( max ) = $9030; 7: 8:proc ans(n) { 9: Cnt = Cnt + 1; 10:# PrnStr_("\nNo"); 11:# PrnDecF_(Cnt,3); 12:# PrnChar_(':'); 13:# PrnDecF_(n,4); 14:} 15: 16: 17:proc main() { 18: var i,j,max; 19: PrnStr_("\ninput Max:"); 20: max=Input_(); 21: Timer_ = 32000; 22: Cnt=0; 23: if (max>1) { 24: ans(2); 25: } 26: for (i=3;i<=max;i=i+2) { 27: for (j=2;j<i;j=j+1) { 28: if (i%j=0) { 29: j=i+1; 30: } 31: } 32: if (j=i) { 33: ans(i); 34: } 35: } 36: PrnStr_( "¥nAnswer is " ); 37: PrnDec_( Cnt ); 38: PrnStr_( "¥npicle time[ms] : " ); 39: PrnDec_( (32000 - Timer_) * 10 ); 40: Timer_ = 32000; 41: PrnStr_( "¥nAnswer is " ); 42: PrnDec_( prime( max ) ); 43: PrnStr_( "¥nxc16 time[ms] : " ); 44: PrnDec_( (32000 - Timer_) * 10 ); 45:} :run input Max:5000 Answer is 669 picle time[ms] : 5280 Answer is 669 xc16 time[ms] : 3240 : |
[TOP] [ 前へ ] 連載記事 [ 次へ ]
コメント 0